python多进程 获取子进程的返回值

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

你可能感兴趣的:(python,多进程,python,多进程,queue,队列)