我有以下代码:
from concurrent.futures import ThreadPoolExecutor
def download_contract_history(self, **kw):
ThreadPoolExecutor().map(lambda x: x.download_contract_history(**kw), self.instruments.values())
print("All downloads complete.")
它当前立即打印“所有下载完成”,而实际下载任务则异步继续。如何在线程实际完成后打印语句?
答案 0 :(得分:0)
https://docs.python.org/dev/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor中的原因:
等效于map(func,* iterables),除了func是异步执行的,并且可以同时对func进行多次调用。
如果你不介意留在现在:
from multiprocessing.pool import ThreadPool as Pool
Pool(processes=4).map(lambda x: x.download_contract_history(**kw),self.instruments.values())
池映射功能是一个阻塞功能,因此您无法继续使用print语句。
注意你可能不想使用线程(谷歌python线程GIL)这样的事情(我认为,如果我错了,请纠正我),所以要使用常规多进程:
from multiprocessing import Pool
答案 1 :(得分:0)
能够同时做其他事情是有道理的。如果您想等待完成,那么您需要检查返回的结果。
The docs不是很清楚,但他们确实说:
返回的迭代器会引发
concurrent.futures.TimeoutError
if 调用__next__()
并且超时秒后结果不可用
所以似乎map
返回结果迭代器,结果是实际结果而不是期货,所以你可以这样做:
from concurrent.futures import ThreadPoolExecutor
def download_contract_history(self, **kw):
results = list(
ThreadPoolExecutor().map(
lambda x: x.download_contract_history(**kw),
self.instruments.values()
)
)
print("All downloads complete.")