1、使用进程的队列multiprocessing.Queue,put(),get()方法
子进程不需返回值,将目标结果放入队列中
在主进程中获取 get方法
""" coding:utf-8"""
#coding:utf-8
import random
import time
import multiprocessing
def worker(k,q):
t = 0
print "processname",k
for i in range(10):
x = random.randint(1, 3)
t += x
q.put(t)
if __name__ == '__main__':
q = multiprocessing.Queue()
jobs = []
for i in range(10):
p = multiprocessing.Process(target=worker, args=(str(i), q))
jobs.append(p)
p.start()
for p in jobs:
p.join()
results = [q.get() for j in jobs]
print(results)
打印值:
processname 1
processname 0
processname 2
processname 5
processname 8
processname 3
processname 4
processname 6
processname 9
processname 7
[22, 23, 17, 20, 24, 18, 22, 19, 22, 19]
2、使用Pool.map()
子进程需要返回值,主进程获取返回值的列表
from multiprocessing import Pool
import time
def func(i):
return i*i
if __name__ == '__main__':
p = Pool(5)
ret = p.map(func,range(10))
print(ret)
3、使用pool.apply_async,子进程有返回值,主进程获取子进程返回的对象(非返回值),需使用get方法获取对象的值
from multiprocessing import Pool
import time
def func(i):
return i*i
if __name__ == "__main__":
print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
pool = multiprocessing.Pool(processes=8) # 创建4个进程
results = []
length = 5000
for i in xrange(8):
results.append(pool.apply_async(func, (i,)))
pool.close() # 关闭进程池,表示不能再往进程池中添加进程,需要在join之前调用
pool.join() # 等待进程池中的所有进程执行完毕
print ("Sub-process(es) done.")
k = 0
for res in results:
k += res.get()
print k