目前,我在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方式?