python强制暂停线程_关于python:使用ThreadPoolExecutor强制线程超时

我正在升级我的代码以使用ThreadPoolExecuter,并希望能够超时需要超过几秒钟处理的任何线程。 是否可以在作为线程池一部分的线程上强制超时? 我正在使用的代码如下。

1

2

3

4

5

6

7

8

9

10with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor:

future_tasks = {executor.submit(self.crawl_task, url): url for url in self.results.keys()}

for future in concurrent.futures.as_completed(future_tasks):

url = future_tasks[future]

try:

result = future.result()

self.results[result[0]] = result[1]

except Exception as e:

print('%r generated an exception: %s' % (url, e))

我能够超时线程的唯一方法是改变

1for future in concurrent.futures.as_completed(future_tasks):

1for future in concurrent.futures.as_completed(future_tasks, timeout=1):

但是,这将打破整个循环,我将无法知道哪个线程超时以及哪些数据导致超时。

1

2

3

4

5

6

7

8Traceback (most recent call last):

File"test.py", line 75, in

request = Requests(data)

File"test.py", line 22, in __init__

for future in concurrent.futures.as_completed(future_tasks, timeout=1):

File"/source/homebrew/Cellar/python3/3.4.0_1/Frameworks/Python.framework/Versions/3.4/ lib/python3.4/concurrent/futures/_base.py", line 213, in as_completed

len(pending), len(fs)))

concurrent.futures._base.TimeoutError: 17 (of 17) futures unfinished

在异常中包装期货的整个for循环仍允许其他线程结果处理。 使用两个单独的词典,您可以查看由于超时而停止的线程。

1

2

3

4

5

6

7

8

9

10

11

12

13with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor:

future_tasks = {executor.submit(self.crawl_task, url): url for url in self.requests.keys()}

try:

for future in concurrent.futures.as_completed(future_tasks, timeout=10):

result = future.result()

self.responses[result[0]] = result[1]

except Exception as e:

print(e)

timeout = [url for url in self.requests.keys() if url not in self.responses.keys()]

print('URL Threads timed out: ', timeout)

我必须指出,这违背了传统观念。 通常,如果在异常中包装整个for循环,则循环中异常之后的任何内容都不应该处理,但是期货的魔力似乎允许循环中的所有内容(除了超时的线程)进行处理。

谢谢这个答案解决了我的问题。但是,我仍然对这个魔法有点困惑,并且在文档中没有找到任何关于它的内容。

一种方法是在self.crawl_task中执行开始时将url记录在文件中。 在线程任务完成之前,它可以附加一个字符串"DONE",也许还有一个时间戳。

此外,您需要处理该TimeoutError异常,以免执行中断。 如果超时,您可以查看其中没有"DONE"字符串的文件日志。

这将导致整个循环中断,并将从其他几个未超时的线程中丢失数据。分析日志文件不是管理线程状态的理想方法。

你可以做一些事情,比如在try块中嵌入"future in future.futures.as_completed(future_tasks):"并忽略异常。您可以通过简单地标记此条件来忽略日志。

这将导致所有线程超时。如何在不超出整个线程池的情况下超时单个线程?

在result()中似乎有超时支持。例如结果(超时=无)

我看到了发布的其他stackoverflow帖子并试了一下。它实际上不会导致超时,也无法找到任何有关它的文档。

好的。因此,需要在crawl_task内编程超时。

crawl_task中有一个超时检查。但是,当将其添加到生产代码中时,复杂性将更高。此外,请求超时不是100%可靠,并且需要有一种超时线程的方法。

在你的回答中,我看到你在try块中嵌入了for循环并继续执行。这就是Python异常主要起作用的方式。不幸的是,我没有办法确认Future的行为,因为我没有访问带有python 3的终端。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值