[python]多进程

一 定义与解释
对于python代码,多线程其实是个假的,因为每次计算的时候,实质上只有一个线程计算。使用多线程时,是几个线程之间切换计算,就像轮班工作一下,适合处理I/O密集型的任务。
对于python代码,多进程才是真正意义上的多个进程在同一时间同时计算,就像几个人同时工作,适合处理计算(CPU)密集型的任务
进程池就是我们将所要运行的东西,放到池子里,Python会自行解决多进程的问题

 

同步或异步获取返回值

#p = Pool()
    #p.map(funcname,iterable) 默认异步的执行任务,且自带close,join功能
    #p.apply(), 同步调用进程池的方法
    #p.apply_async(),异步调用,和主进程完全异步,需要手动close和join
from multiprocessing import Pool
import time
def func(i): #返回值只有进程池才有,父子进程没有返回值
    time.sleep(0.5)
    return i*i

if __name__ == '__main__':
    p = Pool(5)
    res_l = [] #从异步提交任务获取结果
    for i in range(10):
        # res = p.apply(func,args=(i,)) #apply的结果就是func的返回值,同步提交
        # print(res)

        res = p.apply_async(func,args=(i,)) #apply_sync的结果就是异步获取func的返回值
        res_l.append(res) #从异步提交任务获取结果
    for res in res_l:  print(res.get()) #等着func的计算结果

利用MAP返回值

  • map是一次性返回所有子进程的返回值, 自带close,join

通过tuple传递多个参数(目前是两个,多个的话,应该可以将tuple数量扩展来实现)

例如mylist = [(a,b,c),(d,e,f)...]这样

from multiprocessing import Pool

def f(param ):    

    print(param[0],param[1],type(param))
    return param[0],param[1]

param1 = {'a':"xxx",
        'b':"yyy",
        'c':"zzz"}
l1 = ["aa","dd","cc"]
l2 = ["m","nn","fff"]
ll = []
all_ll = []
for x,y in zip(l1,l2):
    ll.append(x)
    ll.append(y)
    ccc = tuple(ll)
    all_ll.append(ccc)
    ll.clear()
print(all_ll)

param = [('a','b'),('s','f')]
if __name__ == '__main__':
    pool = Pool(2)
    res = pool.map(f,param )

上边的返回值,也会类似mylist = [(a,b,c),(d,e,f)...]这样返回回来

 

for x,y in res:

        dict_container[x] = y

这样组成自己想要的数据结构

 

https://www.cnblogs.com/konglinqingfeng/p/9699947.html

https://blog.csdn.net/zsc201825/article/details/96484910

https://blog.csdn.net/u013421629/article/details/100284962

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值