使用多个线程来取消阻止网络调用

问题描述 投票:0回答:1

为简化起见,假设我要从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中?

python python-3.x multithreading concurrency
1个回答
0
投票

同时进行工作并从每个线程获取响应的简单方法是使用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只是为您提供了摘要。

© www.soinside.com 2019 - 2024. All rights reserved.