使用多处理的Python进程词典[Python3.7]
问题描述
我是多处理的新手,我需要一些帮助来了解如何将当前代码转换为使用多处理,以便它可以更快地处理数据。我有以下数据
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_users
和group_users
数据,以便在数据大量时可以快速处理,我看到了几个例子,并尝试使用并发lib,但由于缺乏多处理知识,我一直在努力工作,任何帮助/指导都将非常感谢。
解决方案
多处理派生多个Python进程作为辅助进程。因此,一个进程中的代码无法访问或修改另一个进程中的变量。它们完全分开,彼此隔绝。有三种方法可以解决此问题:
- 您可以使用multiprocessing
Pipe
orQueue
将数据从工作进程传递回主进程。您不能直接添加到字典中,但可以将单个条目作为PICKED数据传回,并让主线程取消PICKE数据的PICKE并将其存储在字典中。或者,您可以在每个进程中构建单独的词典,并在结束时将它们全部发送回合并。 - 您可以使用
threading
而不是multiprocessing
。线程在很大程度上类似于多处理,只是它在同一个Python解释器中的不同线程中运行其工作者,而不是在不同的解释器中运行。这意味着您可以访问全局共享变量。通常,threading
很慢,因为Python一次只能运行一个线程(查看Global Interpreter Lock了解更多信息)。但是,在这种情况下,看起来线程将花费大部分时间等待get_dl_users
和get_group_users
(我假设它们是网络或数据库操作),因此您可以从多线程中获得很多好处。 - 如果您主要在等待IO操作,则可能根本不需要线程。您可以只使用Python
async
。这允许您在其余代码继续运行的同时异步运行IO操作。特别是,您可以使用asyncio.wait
like this并行运行所有IO操作。
相关文章