我有字典,我正在迭代。目前我以串行方式运行它,一次处理列表中的 1 个项目,这工作正常,但我想通过使用多处理库来加快这些项目的处理速度。
有很多关于进程/线程/池的信息,但我不确定我将如何实现这一点。
我希望可以选择一次指定最多 5 个线程/进程,但不确定迭代的工作原理(即我是先遍历"任务"还是遍历线程/进程的数量?
例如,我有一个包含 2 级层次结构的字典:
dict = {'router1': {'id': 1, 'name': 'rtr1_core'}, 'router2': {'id': 2, 'name': 'rt2_core'}, 'router3': {'id': 3, 'name': 'rtr3_access'}}
(注意,我已经简化了每个路由器中的项目列表 - 实际上每个字典中有 20+ 个密钥,但我使用 id 和名称来保持简单。
所以我遍历路由器1...路由器 3 和每个 '{'id': 1, 'name': 'rtr1_core'}' 字典需要传递给包含单个参数(字典(的 'process_routers' 函数。
我不需要在进程之间共享信息。
我设法得到了:
# Process the data
p = multiprocessing.Process(target=process_rtr, args=(rtr_data,))
p.start()
p.join()
这似乎仍在串行运行它 - 如何在多达 x 个线程中并行运行它们?
实际上,我希望根据我们当前的硬件在大约 5-5 个线程中执行大约 50k 次process_rtr函数。因此,指定线程/进程的数量会很棒,这样我就可以根据需要进行调整。
非常感谢您的时间和帮助。
弗兰克
既然你使用的是Python 3.6,你有没有考虑过asyncio库?我不确定您在process_rtr函数中做了什么,因此您可能需要查看一些 asyncio 兼容库(异步库(。应该能够做这样的事情:
import asyncio
import random
dict = {'router1': {'id': 1, 'name': 'rtr1_core'},
'router2': {'id': 2, 'name': 'rt2_core'},
'router3': {'id': 3, 'name': 'rtr3_access'}}
async def process_rtr(id, name):
"""Do your execution here."""
s_time = await asyncio.sleep(random.randint(0, 5))
print(f"Processing {id}, {name}")
loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(process_rtr(**router_details))
for router, router_details
in dict.items()]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
你的框架有点不对劲。 确保设置 N 个作业。
jobs = [Process(target=yourfunction, args=(yourdata) for i in range(numberofthreads)]
for j in jobs:
j.start()
for j in jobs:
j.join()
但请注意,如果您说以下内容,您可能会感到失望:
manager = Manager()
yourdata= manager.dict(routerdict)
托管词典将拾取您的所有数据并使其安全锁定。这需要时间。如果您只有一个包含 ID 或其他内容的托管列表,事情会更快。如果yourfunction
可以通过从其他来源中提取基础数据来访问基础数据,则可以获得很大的速度。您所需要的只是一个简单元素的托管/锁定列表(routerid1,routerid2,...(,而不是一个巨大的共享数据(数据如此之大,以至于您想要并行处理它......