Python - 在超时时重新提交未来

时间:2013-11-26 16:12:54

标签: python concurrency timeout future pool

目前,我在Python中使用期货,以便同时连接(和分析)多个站点。

with concurrent.futures.ThreadPoolExecutor(max_workers = 8) as executor:
        futures = {executor.submit(analyser.analyse, name, aggregator, past, current):
                       (name, aggregator) for name, aggregator in aggregators.iteritems()}

        for future in concurrent.futures.as_completed(futures):
            records += future.result()

然而,期货有时会“卡在”某些网页上,至少这是我的假设。 (一般来说,我试图解决的问题是,当从cronjob启动脚本时,进程有时会卡住)。

但我想要做的是对某些期货实施“超时”,所以如果它超过了时间限制,将来会再次提交给池。

with concurrent.futures.ThreadPoolExecutor(max_workers = 8) as executor:
        futures = {executor.submit(analyser.analyse, name, aggregator, past, current):
                       (name, aggregator) for name, aggregator in aggregators.iteritems()}

        for future in concurrent.futures.as_completed(futures):
            try:
                records += future.result(timeout = 30)
            except concurrent.futures.TimeoutError:
                if DEBUG:
                    print("Future took too long, retrying!")

不幸的是,我找不到将未来重新提交回池的方法,因为执行者只接受“原始”对象,而不是期货。是否有任何Pythonic方式?

1 个答案:

答案 0 :(得分:0)

无法重新提交,因为您不必:它将保留在池中,除非您明确取消它。更多:How to use concurrent.futures with timeouts?