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
  • 15
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python中,我们可以使用`multiprocessing`模块来创建多进程。当我们使用多进程时,有时候需要等待子进程完成某些任务并返回结果,然后再继续执行主进程的任务。这时候,我们需要获取子进程返回值。 在`multiprocessing`模块中,获取子进程返回值有两种方式:`join()`方法和`Queue`队列。 方法一:使用`join()`方法 我们可以在主进程中使用`join()`方法来等待子进程执行完毕,并获取子进程返回值。 示例代码: ```python from multiprocessing import Process def func(num): return num * 2 if __name__ == '__main__': p = Process(target=func, args=(10,)) p.start() p.join() result = p.exitcode print(result) ``` 在上面的示例中,我们创建了一个子进程`p`,并传入参数`10`。子进程执行的函数是`func`,该函数会返回传入参数的两倍。在主进程中,我们使用`join()`方法等待子进程执行完毕,并获取子进程返回值。`exitcode`属性返回子进程的退出码,也就是子进程执行完毕后的返回值。 方法二:使用`Queue`队列 我们可以在主进程中创建一个`Queue`队列,然后将子进程执行的结果放入该队列中,在主进程中从队列获取子进程返回值。 示例代码: ```python from multiprocessing import Process, Queue def func(num, result_queue): result_queue.put(num * 2) if __name__ == '__main__': result_queue = Queue() p = Process(target=func, args=(10, result_queue)) p.start() p.join() result = result_queue.get() print(result) ``` 在上面的示例中,我们创建了一个子进程`p`,并传入参数`10`和一个`Queue`队列`result_queue`。子进程执行的函数是`func`,该函数会将传入参数的两倍放入`result_queue`队列中。在主进程中,我们使用`join()`方法等待子进程执行完毕,并从`result_queue`队列获取子进程返回值。 需要注意的是,在使用`Queue`队列时,我们需要在创建子进程时将队列对象传递给子进程,以便子进程能够将结果放入队列中。同时,获取返回值时也需要从队列获取

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值