Python3.8将for循环转换为多处理/多线程

Python3.8将for循环转换为多处理/多线程,python,python-3.x,python-multiprocessing,python-multithreading,Python,Python 3.x,Python Multiprocessing,Python Multithreading,我是多道处理新手,如果有人能在这里指导/帮助我,我将不胜感激。我有下面的for循环,它从两个函数中获取一些数据。代码如下所示 for a in accounts: dl_users[a['Email']] = get_dl_users(a['Email'], adConn) group_users[a['Email']] = get_group_users(a['Id'], adConn) print(f"Users part of D

我是多道处理新手,如果有人能在这里指导/帮助我,我将不胜感激。我有下面的for循环,它从两个函数中获取一些数据。代码如下所示

    for a in accounts:
        dl_users[a['Email']] = get_dl_users(a['Email'], adConn)
        group_users[a['Email']] = get_group_users(a['Id'], adConn)

    print(f"Users part of DL - {dl_users}")
    print(f"Users part of groups - {group_users}")
    adConn.unbind()


这很好,并且得到了所有的结果,但最近我注意到,获取用户列表(即dl_用户和group_用户)需要很多时间。几乎需要14-15分钟才能完成。我正在寻找加速函数的方法,并希望将此for循环转换为多处理
get_group_users
get_dl_users
调用LDAP,因此我不能100%确定是否应该将其转换为多处理或多线程。任何建议都会大有帮助

如评论中所述,多线程适用于I/O操作(读取/写入文件、发送http请求、与数据库通信),而多处理适用于CPU限制的任务(如转换数据、进行计算……)。根据功能执行的操作类型,您需要其中一种。如果它们混合使用,请在内部将它们分开,并确定哪一个真正需要优化,因为多处理和线程都会引入可能不值得增加的开销

也就是说,在最近的Python版本(包括3.8)中,应用多处理或多线程的方法非常简单

多处理 来自多处理导入池的

#选择最适合您的流程数量
进程=4
将池(进程)作为池:
processed=pool.map(你的函数,你的数据)
其中,
your_func
是一个应用于
your_data
的每个元素的函数,它是一个iterable。如果需要为可调用对象提供一些其他参数,可以使用lambda函数:

processed=pool.map(lambda项:您的函数(item,some\u kwarg=“some value”)、您的数据)
多线程 多线程API非常相似:

从concurrent.futures导入ThreadPoolExecutor
#选择最适合你的员工数量。
#很可能等于机器的线程数量。
工人=4
将ThreadPoolExecutor(workers)作为池:
processed=pool.map(你的函数,你的数据)
如果您需要项目的某些属性而不是项目本身,则可以使用生成器,以避免在内存中存储
您的_数据

processed=pool.map(您的_func,(账户中账户的账户[“Email”]))

请记住,多处理和多线程不是一回事。如果需要计算大量I/O绑定的任务,如网络连接,则使用线程。对于CPU密集型任务,请使用多处理。感谢您的回复,是的,我觉得多处理将是正确的方法。感谢您的解释。非常感谢您的帮助。我尝试使用多线程
dl\u users=pool.map(get\u dl\u users,[(account[“Email”]用于accounts in accounts),adConn])
当我尝试打印
dl\u users
时,如何查看结果?它只返回
我如何等待结果,然后继续?您还可以确认这是否是将
adConn
作为参数传递的方式。通过这种方式,您可以将整个
[(帐户[“电子邮件”]…),adConn]
作为map()的第二个参数传递。该参数应该是一个iterable,但您给它一个iterable列表。检查我的上一个代码示例,了解如何传递第二个参数;要正确地传递adConn,请使用lambda查看“多重处理”下的最后一个示例。