1、进程
- 运行起来的程序,叫进程。
- 运行程序时,先加载在内存,然后告诉OS要做什么操作。
- 进程创建多任务,占用资源相当大。进程就是在原基础上copy一份主进程资源。
import multiprocessing
#创建对象
def test1():pass
def test2():pass
def main():
p1 = multiprocessing.Process(target=test1)
p2 = multiprocessing.Process(target=test2)
#新的进程创建
p1.start()
p2.start()
main()
- 资源能共享的共享,实在不能共享的再copy一份。即:写时拷贝
- 进程占用资源大,线程占用资源小
2、进程、线程对比
-
进程:实现多任务,资源及代码总称,进程是资源分配的单位。一个进程里面至少有一个主线程。进程间不共享全局变量,互相独立。
-
线程:实现多任务,先有进程再有线程。真正实现任务的是线程。线程是操作系统调度的单位
3、进程间的通信
- socket
- 文件
- 队列Queue,先进先出。
耦合度越高,程序越不好,越低越好。通过队列解耦,实现进程间通信。
Queue只能一个程序,一个电脑里面实现进程间通信,还不能跨电脑。以后使用redis,实现分布式。
import multiprocessing
from multiprocessing import Queue
def write(q):
data = [1,2,3,4]
#数据放入队列
for i in data:
q.put(i)
print("数据放入队列中")
def read(q):
#取数据
readlist = list()
while True:
data = q.get()
readlist.append(data)
if q.empty():
break
print("数据从队列中取出:",readlist)
def main():
#创建一个队列,队列长度5000
q = Queue(5000)
#创建多个进程,将队列的引用当做实参进行传递
p1 = multiprocessing.Process(target=write,args=(q,))
p2 = multiprocessing.Process(target=read,args=(q,))
#新的进程创建
p1.start()
p2.start()
if __name__ == '__main__':
main()
4、进程池Pool
- 进程池是一个特殊容器,容纳很多进程。
- 程序的创建和销毁会花大量时间和资源,所以进程池就可以解决这一问题。