进程是操作系统的基本单元。一个程序运行后结束后,代码+用到的资源为进程
- 进程的创建Process
from multiprocessing import Process
def sing():
for i in range(5):
print("正在唱111")
time.sleep(1)
def dance():
for i in range(10):
print("正在跳222")
time.sleep(1)
def main():
t1=Process(target=sing)
t2=Process(target=dance)
t1.start()
t2.start()
if __name__=="__main__":
main()
- 进程间的通信(队列)
from multiprocessing import Process,Queue
def dowma(q):
data=[11,22,33,44]
for temp in data:
q.put(temp)
print("已经传入到队列中")
def analy(q):
wali =list()
while True:
data =q.get()
wali.append(data)
if q.empty():
break
print(wali)
def main():
#创建一个队列
q=Queue(3)
#创建进程,将引用传入当实参
t1=Process(target=dowma,args=(q,))
t2=Process(target=analy,args=(q,))
t1.start()
t2.start()
if __name__=="__main__":
main()
- 进程池
当进程较多可以使用Pool方法,指定一个最大进程数。
如果池还没有满,就会创建一个新的进程来执行该请求;但如果达到制定的最大值,请求就会等待
from multiprocessing import Pool
import os, time, random
def long_time_task(name):
print 'Run task %s (%s)...' % (name, os.getpid())
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print 'Task %s runs %0.2f seconds.' % (name, (end - start))
if __name__=='__main__':
print 'Parent process %s.' % os.getpid()
p = Pool()
for i in range(5):
p.apply_async(long_time_task, args=(i,))
print 'Waiting for all subprocesses done...'
p.close()
p.join()
print 'All subprocesses done.'
对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。
请注意输出的结果,task 0,1,2,3是立刻执行的,而task 4要等待前面某个task完成后才执行,这是因为Pool的默认大小在我的电脑上是4,因此,最多同时执行4个进程。这是Pool有意设计的限制,并不是操作系统的限制。
总结
在Unix/Linux下,可以使用fork()调用实现多进程。
要实现跨平台的多进程,可以使用multiprocessing模块。
进程间通信是通过Queue、Pipes等实现的。