multiprocess 模块
-
process
from multiprocessing import Process, Pool import time import random import os def run_task(name): print "Child process %s(%s) is running." % (name, os.getpid()) if __name__ == "__main__": print "Current process %s." % os.getpid() for i in range(5): p = Process(target=run_task, args=(str(i), )) p.start() p.join() print "Waiting for subprocess done"
process.join用来阻塞进程,等上一个p进程执行完,才往下继续执行
如果没有指定target,默认执行process.run方法 -
pool
创建容量为3的线程池,并依次向其中加入5个任务,从结果看,虽然添加了5个任务,但是一开始只运行了其中的3个,而且每次最多运行3个,当一个任务结束了,新的任务添加进来,任务 执行使用的进程依然是原来的进程,这一点从进程的pid可以看出来from multiprocessing import Process, Pool import time import random import os def run_task(name): print "Child process %s(%s) is running." % (name, os.getpid()) time.sleep(random.random() * 4) print "Child process %s(%s) end." % (name, os.getpid()) if __name__ == '__main__': print "Current process %s." % os.getpid() p = Pool(processes=3) for i in range(5): p.apply_async(run_task, args=(str(i), )) print "Waiting for all subprocess done..." p.close() #调用join之前,必须调用close,调用close之后,不能再向进程池中添加进程 p.join() print "All subprocess done..."
-
进程间通信
创建了大量的进程,就必须进程间的通信,python提供多种进程间通信的方式,例如Queue,Pipe,Value+Array等
Queue和Pipe的区别在于,Pipe主要用来两个进程间通信,Queue用来多个进程间通信- Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递
Put方法用来向队列中插入数据,可选参数为blocked,timeout,如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间,如果超时,会抛出Queue.Full异常,如果blocked为False,改Queue已满,则立即抛出Queue,Full异常
Get方法可以从队列中读取并删除一个元素,可选参数为blocked,timeout,如果blocked为True(默认值),并且timeout为正值,那么在等待的timeout时间内没有取到任何元素,会抛出Queue.Empty异常,如果blocked为False,Queue中有一个值,则立即返回该值,否则立即抛出Queue.Empty异常
- Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递