gpt4 book ai didi

使用线程的 Pythonic 方式

转载 作者:行者123 更新时间:2023-12-05 08:45:13 28 4
gpt4 key购买 nike

最近我一直在做很多网络或 IO 绑定(bind)操作,使用线程有助于加快代码速度。我注意到我一直在一遍又一遍地编写这样的代码:

threads = []
for machine, user, data in machine_list:
mythread = threading.Thread(target=get_info, args=(machine, user, data))
mythread.start()
threads.append(mythread)

for mythread in threads:
mythread.join()

这感觉有点重复。它有效,但我怀疑可能有更“Pythonic”的方式来编写它。有什么建议吗?

最佳答案

您要找的是multiprocessing.pool.ThreadPool , 与 multiprocessing.pool.Pool 具有相同的语义,但使用线程而不是进程。

你可以像这样更简洁地做你当前正在做的事情:

from multiprocessing.pool import ThreadPool

pool = ThreadPool() # optionally pass the number of threads in the pool
res = pool.starmap_async(get_info, machine_list)
res.wait()

这并不完全等同于您的代码,因为 ThreadPool 创建固定数量的线程(默认情况下等于可用 CPU 的数量)并在它们之间分配工作,但您仍然可以传递该数量您希望(例如 ThreadPool(len(machine_list)))为列表中的每一项创建一个。

然后您还可以创建一个函数来轻松地多次执行此操作:

def run_threads(func, arglist):
ThreadPool(len(arglist)).starmap_async(func, arglist).wait()

注意:.starmap_async() 只是实现此目的的一种方法。您可以使用多种方法。查看上面链接的 Pool 文档,然后选择您喜欢的一个。

关于使用线程的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73546342/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com