Python多进程池的使用详解,以及结合tqdm进度条的使用

本文详细介绍了Python的multiprocessing模块中进程池Pool的四种常用方法:apply、apply_async、map和map_async。通过实例展示了它们的异同,特别是异步方法中回调函数和进度条的实现。强调了map和map_async在处理大量相同任务时的高效并行执行能力,并提供了使用tqdm创建多进程进度条的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程池是为了简化多进程任务而生。当我们有大量的任务,其处理函数都是相同的,或者只是函数参数不同。这种情况,直接生成和任务数量相同的进程是极其消耗资源的(比如用Process和for依次生成进程)。这个时候就非常适合使用进程池Pool

import multiprocessing as mp
n_proc = 5
pool = mp.Pool(n_proc)

以上代码生成了5个进程的池子。最多可以同时运行5个相同的函数。
pool类有以下4种非常常用的类型。

  • apply:阻塞,任务其实是一个一个执行完的。无法实现并行效果
  • apply_async
  • map
  • map_async

其中map和map_async的用法接近,apply和appy_async的用法接近。
带async的区别主要有:

  • 返回的顺序不是按照建立任务的顺序来的,完全看哪个任务先结束谁先返回
  • 有一个callback参数。可以用于记录返回值和其他回调功能,比如结合tqdm制作多进程进度条。
  • 异步函数接受参数,但同步函数接受一个装载参数的迭代器。

现在有一个函数,功能是睡眠一段时间。来看一下四种函数的用法。

import multiprocessing as mp

def test_func(v):
    print(v)
    sleep(10/2-v/2)  # v越大 运行时间越少
    return v

# 所需要测试的数据
data = range(10)

apply

# apply
n_proc = 5
pool = mp.Pool(n_proc)
res = []
for d in data:
    pool.apply(test_func, (d,))
pool.close()
pool.join()

可以发现,运行的总时长等于所有任务的总时长。那这个函数的意义是?

apply_async

n_proc = 5
pool = mp.Pool(n_proc)
res = []
for d in data:
    tmp = pool.apply_async(test_func, (d,))
    # tmp.get() # 如果有这句,则程序会等待该进程执行完,拿到其返回值,才会进入下个for循环。相当于map的效果
    res.append(tmp)

pool.close()
pool.join()
for r in res:
	# 如果get放到tmp后面,则会实现和map一样的效果
    r.get() # 返回值需要用get()拿到。

从打印内容来看,一共有10个任务,pool同时处理5个任务,哪个任务结束了,该进程就执行下个任务

map

n_proc = 5
pool = mp.Pool(n_proc)
res = pool.map(test_func, data)
pool.close()
pool.join()
print(res) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

也是同时执行5个任务。总时间在5s左右。说明是确实是并行执行以上10个任务的

map_async

n_proc = 5
pool = mp.Pool(n_proc)
res = pool.map_async(test_func, data)
pool.close()
pool.join()
print(res.get())

依然是并行运行

大家应该注意到了。map和map_async没有用到for循环新建进程任务。因此总结出:以map为首的函数用法是,针对多次运行同一个任务(test_func),如果只是参数不同,可以把参数做成一个迭代器。

callback回调函数的用法

带async的函数,支持应用回调函数。
当进行执行完毕,我们就会调用这个回调函数。回调函数的参数有一个,为进程任务的返回值。

def log(v):
    callback_res.append(v)
    # print(callback_res)

data = range(10)
callback_res = []
n_proc = 5
pool = mp.Pool(n_proc)
for d in data:
    pool.apply_async(test_func, (d,), callback=log)
pool.close()
pool.join()
print(callback_res)  # [4, 3, 2, 1, 0, 6, 8, 7, 9, 5]

从该示例中,我们可以看到,log函数中执行的内容是,在callback_res中加入test_func的返回值。同时注意到callback_res不是按照顺序排列的,而是按照执行速度依次排列的。在头5个任务中,输入为4的任务执行最快。

多进程进度条

from tqdm import tqdm
pbar = tqdm(total=len(data))
pbar.set_description('Sleep')
update = lambda *args: pbar.update()

n_proc = 5
pool = mp.Pool(n_proc)
for d in data:
	pool.apply_async(test_func, (d,), callback=update)
pool.close()
pool.join()

在这里插入图片描述
这里我们采用tqdm生成进度条,然后使用labmda操作符,将其转换为函数,然后作为回调对象。那么进程池每处理完一个任务,就会调用一次tqdm的update()。从而实现多进程的进度条显示。

参考

Python multiprocessing.Pool的四种方法比较:: map, apply, map_async, apply_async
Python多进程处理方法(Pool、apply_async、map_async)
python多进程打印进度条
Multiprocessing : use tqdm to display a progress bar

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值