python - Python 3.6 中的多处理

标签 python python-3.x dictionary multiprocessing

我正在遍历字典中的字典。目前,我以串行方式运行此程序,一次处理列表中的 1 个项目,效果很好,但我想通过使用多处理库来加快这些项目的处理速度。

有很多关于进程/线程/池的信息,但我不确定我将如何实现它。

我希望可以选择一次指定最多 5 个线程/进程,但不确定迭代如何工作(即,我是否首先迭代“任务”,或者是否迭代“任务”的数量)线程/进程?

例如我有一个包含 2 个层次结构级别的字典:

dict = {'router1': {'id': 1, 'name': 'rtr1_core'}, 'router2': {'id': 2, 'name': 'rt2_core'}, 'router3': {'id': 3, 'name': 'rtr3_access'}}

(注意,我简化了每个路由器中的项目列表 - 实际上每个字典中有 20 多个键,但我使用 id 和名称来保持简单。)

所以我迭代 router1...router 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-10 个线程中执行 process_rtr 函数大约 50k 次。因此,最好指定线程/进程的数量,这样我就可以根据需要进行调整。

非常感谢您提前抽出时间并提供帮助。

弗兰克

最佳答案

既然您使用的是 Python 3.6,您是否考虑过 asyncio 库?我不确定您在 process_rtr 函数中做什么,因此您可能需要查看一些 asyncio 兼容库( async libraries )。应该能够做这样的事情:

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()

关于python - Python 3.6 中的多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50091695/

相关文章:

Python 期望一个参数,发现三个,正确的语法是什么?

python - 如何在opencv Python中从图像中心(x,y)绘制正方形?

python - 字典只返回 for 循环中的最后一个键值对

java - 使用 Java Streams 将映射列表转换为列表映射

找不到来自 firebug 的 Python Selenium Xpath

python - __slots__ 和 pickle 的奇怪行为

python - 我可以将矢量化函数应用于 pandas 数据框吗?

python - 如何使用填充沿新维度重复 numpy 数组?

python - 如何基于多个定界符 pandas 进行拆分

python - 如何在 python 3 中将字符串转换为字典