ThreadPoolExecutor回调?

时间:2016-11-16 12:58:26

标签: python concurrent.futures

我有以下代码:

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.")

它当前立即打印“所有下载完成”,而实际下载任务则异步继续。如何在线程实际完成后打印语句?

2 个答案:

答案 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.")