python 多进程返回值,python如何多线程处理数据
由于python中GIL (global interpreter lock,全局解释器锁)的存在,python线程实际上并不能很好的发挥任务并行处理的作用,尤其是多核系统的优势无法得到充分发挥。所以如果要用多核处理并行任务,就需要用多进程——multiprocess。因为多进程任务往往需要返回函数的结果,所以我们主要侧重于获取进程的返回值。
首先,定义一个简单的函数:
Add (n): s=0f或I in range(n):s=1 print(f sub process { n } )用串行方法返回s:
Import lists=[1000000,2000000,500000,300000]results=[]start=time . time()for n in lists:results . append(add(n))print(f recurrent时间成本:{time.
子进程1000000子进程2000000子进程500000子进程3000000循环时间成本:3.95s显然,函数是按顺序执行的。我们用多进程看看速度会不会提高。
from多处理导入池pool=pool(processes=4)# number of child processes results=[]start=time . time()for n in lists:result=pool . apply _ async(add,(n,)# apply _ async是apply的并行变体,使用apply会阻塞队列,从而无法实现并行。#输入是函数的名字(注意没有括号)和函数的参数(以元组形式输入)results.append(result)#将返回的结果添加到结果池中. close() #关闭进程池,不能添加进程池. join() #主进程等待所有进程完成执行print (f 多进程时间开销:{time.time ()-start} s) #在结果中为res获取结果:print(res.get())执行的结果:
子流程5000000子流程1000000子流程2000000子流程30000000多流程时间成本:1.91s 100000000020000005000000000003000000000000但是结果返回的顺序与流程添加的顺序相同。
013更新—用线程池测试上面的例子,说明python的多进程确实可以实现多任务并行。我们来测试一下多线程的效果,CPU密集型的多任务并行是否无法实现。我们也用上面的add函数作为基本运算函数。代码如下:
#使用thread pool from concurrent . futures导入threadpoolexecutor pool=threadpooleuxecutor(max _ workers=4)start=time . time()for RES in pool . map(add,Lists):# print(RES)pass sprint(f multi-tfreads时间开销:{time.time ()-start} s )看看结果。
子进程5000000子进程1000000子进程2000000子进程3000000多TF读取时间开销:5.01s可见耗时比for循环长。因为有线程启动和销毁等时间消耗,python的线程不太适合CPU密集型的任务。在这种情况下,最好使用多个进程来执行并行任务!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。