【问题标题】:Python process dictionary using multiprocessing[Python 3.7]使用多处理的 Python 进程字典[Python 3.7]
【发布时间】:2021-04-07 01:21:26
【问题描述】:

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

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)

我想并行填充 dl_usersgroup_users 数据而不是使用 for 循环,因此当数据量很大时可以快速处理它,我看到了几个示例并尝试使用并发库,但由于由于缺乏关于多处理的知识,我一直在努力任何帮助/指导将不胜感激。

【问题讨论】:

    标签: python python-3.x python-multiprocessing python-multithreading


    【解决方案1】:

    多处理生成多个 python 进程来充当工作人员。因此,一个进程中的代码无法访问或修改另一个进程中的变量。它们是完全分开的,彼此隔离。您可以通过三种方式解决此问题:

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

    【讨论】:

    • 感谢您的详细回复,是的,您是正确的get_dl_usersget_group_users 是网络操作。根据您的反馈,我相信多线程是正确的方法
    猜你喜欢
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 2020-03-23
    • 2019-07-17
    • 1970-01-01
    • 2018-07-21
    • 2021-12-03
    相关资源
    最近更新 更多