首页 > 编程知识 正文

python多线程返回结果,python 多进程处理数据

时间:2023-05-04 09:47:53 阅读:225833 作者:2919

由于python内部GIL(全局解释器锁)的存在,所以python的线程实际上并不能很好的起到任务并行处理的作用,尤其是无法充分利用系统多核的优势,因此想要利用多核处理并行任务,就需要用到多进程——multiprocess。由于多进程任务时,经常需要返回函数的结果,这里主要关注进程返回值的获取。
首先定义一个简单函数:

def add(n):s = 0for i in range(n):s += 1print(f'子进程{n}')return s

用串行的方法:

import timelists = [10000000, 20000000, 5000000, 30000000]results = []start = time.time()for n in lists:results.append(add(n))print(f'recurrent time cost: {time.time() - start}s')

打印结果:

子进程10000000子进程20000000子进程5000000子进程30000000recurrent time cost: 3.95 s

很明显,是按顺序执行函数的。下面用多进程实现,看速度是否会提升。

from multiprocessing import Poolpool = Pool(processes=4) # 子进程数results = []start = time.time()for n in lists:result = pool.apply_async(add, (n,) # apply_async是apply的并行变体,使用apply会造成队列阻塞,没法实现并行。# 输入是函数名称(注意没有括号),以及函数的参数(以元组形式按位置排列输入)results.append(result)# 把返回的结果添加到results中pool.close() # 关闭进程池,不能再添加进程pool.join() # 主进程等待所有进程执行完毕print(f'multi-process time cost: {time.time() - start}s')#获取结果for res in results:print(res.get())

执行的结果:

子进程5000000子进程10000000子进程20000000子进程30000000multi-process time cost: 1.91 s1000000020000000500000030000000

可以看到快的先执行完,慢的后执行完,但结果返回的顺序仍与进程添加的顺序一致。

0813更新—使用线程池测试

上面的例子表明python的多进程确实可以实现多任务并行,下面测试多线程的效果,是否无法实现CPU密集型的多任务并行。同样我们使用上面的add函数作为基础运算函数。代码如下:

# 使用线程池from concurrent.futures import ThreadPoolExecutorpool = ThreadPoolExecutor(max_workers=4)start = time.time()for res in pool.map(add, lists):# print(res)passprint(f'multi-tfreads time cost: {time.time() - start}s')

看一下结果

子进程5000000子进程10000000子进程20000000子进程30000000multi-tfreads time cost: 5.01 s

可以看到耗时比for循环还长,因为存在线程开启销毁等时间消耗,所以python的线程对CPU密集型任务不太行,这种情况下还是用多进程执行并行任务的好!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。