使用多处理的Python进程词典[Python3.7]

本教程将介绍使用多处理的Python进程词典[Python3.7]的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

使用多处理的Python进程词典[Python3.7] 教程 第1张

问题描述

我是多处理的新手,我需要一些帮助来了解怎么将当前代码转换为使用多处理,以便它可以更快地处理数据。我有以下数据

accounts = [{'Id': '123',  'Email': 'Test_01@gmail.com', 'Status': 'ACTIVE'},
{'Id': '124',  'Email': 'Test_02@gmail.com', 'Status': 'ACTIVE'},
{'Id': '125',  'Email': 'Test_03@gmail.com', 'Status': 'ACTIVE'}]

我需要处理的代码,目前我正在使用for循环来处理它,运行得很好,但需要更长的时间,这是我想要优化的,代码如下所示-

dl_users = {}
group_users = {}
for a in accounts:
 if a['Status'] == 'ACTIVE':
  dl_users[a['Email']] = get_dl_users(a['Email'])
  group_users[a['Email']] = get_group_users(a['Id'])

print(dl_users)
print(group_users)

我不想使用for循环,而是希望并行填充dl_usersgroup_users数据,以便在数据大量时可以快速处理,我看到了几个例子,并尝试使用并发lib,但由于缺乏多处理知识,我一直在努力工作,任何帮助/指导都将非常感谢。

推荐答案

多处理派生多个Python进程作为辅助进程。因此,一个进程中的代码无法访问或修改另一个进程中的变量。它们完全分开,彼此隔绝。有三种方法可以解决此问题:

    您可以使用multiprocessing Pipe or Queue将数据从工作进程传递回主进程。您不能直接添加到字典中,但可以将单个条目作为PICKED数据传回,并让主线程取消PICKE数据的PICKE并将其存储在字典中。或者,您可以在每个进程中构建单独的词典,并在结束时将它们全部发送回合并。

    您可以使用threading而不是multiprocessing。线程在很大程度上类似于多处理,只是它在同一个Python解释器中的不同线程中运行其工作者,而不是在不同的解释器中运行。这意味着您可以访问全局共享变量。通常,threading很慢,因为Python一次只能运行一个线程(查看Global Interpreter Lock了解更多信息)。但是,在这种情况下,看起来线程将花费大部分时间等待get_dl_usersget_group_users(我假设它们是网络或数据库操作),因此您可以从多线程中获得很多好处。

    如果您主要在等待IO操作,则可能根本不需要线程。您可以只使用Pythonasync。这允许您在其余代码继续运行的同时异步运行IO操作。特别是,您可以使用asyncio.waitlike this并行运行所有IO操作。

好了关于使用多处理的Python进程词典[Python3.7]的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。