Python多任务处理:多进程篇

共 620字,需浏览 2分钟

 ·

2020-12-08 23:29

多进程处理CPU密集型任务
CPU密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。一个线程执行CPU密集型任务的时候,CPU处于忙碌状态,运行1000个字节码之后GIL会被释放给其他线程,加上切换线程的时间有可能会比串行代码更慢。在Python多任务处理(多线程篇),我们试图用多线程执行CPU密集型任务,然而并没有性能上的提升。现在我们试一下用多进程来处理CPU密集型任务。
1. 建立进程池
from concurrent.futures import ProcessPoolExecutor
from time import sleep, time
import os
print("CPU核数为%s个!" % os.cpu_count())
CPU核数为8个!
# Worker数量
N = 8
# 建立进程池
pool = ProcessPoolExecutor(max_workers=N)
2. 定义一个CPU密集型函数
该函数会对[1, x]之间的整数进行求和。
def cpu_bound_func(x):
    tot = 0
    a = 1
    while a <= x:
        tot += x
        a += 1
    print("Finish sum from 1 to %d!" % x)
    return tot
3. 使用串行的方式处理
遍历一个列表的所有元素,执行func函数。
def process_array(arr):
    for x in arr:
        cpu_bound_func(x)
4. 使用多进程处理
通过线程池的map方法,可以将同一个函数作用在列表中的所有元素上。
def fast_process_array(arr):
    for x in pool.map(cpu_bound_func, arr):
        pass
5. 计算函数运行时间
  • 串行版本的运行时间5.7秒
  • 多进程版本的运行时间1.6秒
def time_it(fn, *args):
    start = time()
    fn(*args)
    print("%s版本的运行时间为 %.5f 秒!" % (fn.__name__, time() - start))
time_it(process_array, [10**7 for _ in range(8)])
Finish sum from 1 to 10000000!
Finish sum from 1 to 10000000!
Finish sum from 1 to 10000000!
Finish sum from 1 to 10000000!
Finish sum from 1 to 10000000!
Finish sum from 1 to 10000000!
Finish sum from 1 to 10000000!
Finish sum from 1 to 10000000!
process_array版本的运行时间为 5.74394 秒!
time_it(fast_process_array, [10**7 for _ in range(8)])
fast_process_array版本的运行时间为 1.62266 秒!

作者:李小文,先后从事过数据分析、数据挖掘工作,主要开发语言是Python,现任一家小型互联网公司的算法工程师。

Github: https://github.com/tushushu


更多阅读



用 PyQt 打造具有专业外观的GUI(上)


Python 中用多线程进行多任务处理


pip 20.3 新版本发布!即将抛弃 Python 2.x


特别推荐


程序员摸鱼指南


为你精选的硅谷极客资讯,
来自FLAG巨头开发者、技术、创投一手消息




点击下方阅读原文加入社区会员

浏览 11
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报