使用多个线程解除网络调用的阻塞

为简化起见,假设我要从S3将多个大文件下载到本地计算机上。

def get_file(name):
    # pull from S3 and returns DataFrame
    return df

if __name__ == "__main__":
    df1 = get_file("large_file_1.csv")
    df2 = get_file("large_file_2.csv")
    df3 = get_file("large_file_3.csv")

,我想重构该代码以使这些调用成为非阻塞(即,立即开始从S3中拉出所有调用,然后等待它们完成)。我的第一个本能是将线程模块与类似

一起使用
from threading import Thread

if __name__ == "__main__":
    t1 = Thread(target=get_file,args=("large_file_1.csv",))
    t2 = Thread(target=get_file,args=("large_file_2.csv",))
    t3 = Thread(target=get_file,args=("large_file_3.csv",))

    t1.start()
    t2.start()
    t3.start()

    t1.join()
    t2.join()
    t3.join()

但是,Thread没有提供一种将目标函数的返回值分配给变量的方法。这样做的首选方式是在Python中?

dongdong28098 回答:使用多个线程解除网络调用的阻塞

同时进行工作并从每个线程获取响应的一种简单方法是使用ThreadPoolExecutor

from concurrent.futures import ThreadPoolExecutor

def get_file(f):
    # Do real work here
    return f + "1"  # Return a real result here

l = ["large_file_1.csv","large_file_2.csv","large_file3.csv"]
pool = ThreadPoolExecutor(3)
out = pool.map(get_file,l)
print(list(out))

输出:

['large_file_1.csv1','large_file_2.csv1','large_file3.csv1']

您还可以继续直接使用Thread,并使用Queue来获得结果,但是ThreadPoolExecutor可以帮您抽象出来,因此确实没有必要。

本文链接:https://www.f2er.com/3163781.html

大家都在问