使用多处理的Python进程词典[Python3.7] [英] Python process dictionary using multiprocessing[Python 3.7]

查看:15
本文介绍了使用多处理的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_usersgroup_users数据,以便在数据大量时可以快速处理,我看到了几个例子,并尝试使用并发lib,但由于缺乏多处理知识,我一直在努力工作,任何帮助/指导都将非常感谢。

推荐答案

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

  1. 您可以使用multiprocessing Pipe or Queue将数据从工作进程传递回主进程。您不能直接添加到字典中,但可以将单个条目作为PICKED数据传回,并让主线程取消PICKE数据的PICKE并将其存储在字典中。或者,您可以在每个进程中构建单独的词典,并在结束时将它们全部发送回合并。
  2. 您可以使用threading而不是multiprocessing。线程在很大程度上类似于多处理,只是它在同一个Python解释器中的不同线程中运行其工作者,而不是在不同的解释器中运行。这意味着您可以访问全局共享变量。通常,threading很慢,因为Python一次只能运行一个线程(查看Global Interpreter Lock了解更多信息)。但是,在这种情况下,看起来线程将花费大部分时间等待get_dl_usersget_group_users(我假设它们是网络或数据库操作),因此您可以从多线程中获得很多好处。
  3. 如果您主要在等待IO操作,则可能根本不需要线程。您可以只使用Pythonasync。这允许您在其余代码继续运行的同时异步运行IO操作。特别是,您可以使用asyncio.waitlike this并行运行所有IO操作。

这篇关于使用多处理的Python进程词典[Python3.7]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆