为简化起见,假设我要从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中拉出所有调用,并等待它们完成)。我的第一个直觉是将threading模块与
一起使用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中?
同时进行工作并从每个线程获取响应的简单方法是使用ThreadPoolExecutor
:
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
只是为您提供了摘要。