我正在升级我的代码以使用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的终端。

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

  1. python 批量创建线程_【Python】批量创建线程

    在<[Python]线程的创建.执行.互斥.同步.销毁>(点击打开链接)中介绍了Python中线程的使用,但是里面线程的创建,使用了很原始的方式,一行代码创建一条.其实,Python里是可 ...

  2. python结束进程树_【python爬虫】线程进程

    关注:程序运行速度---->主要是由cpu(大脑)来决定. 想要提高程序的运行速度----->提高cpu利用率. 提高cpu的利用率由两种途径: 1.让cpu不休息.cpu每时每刻都在处理 ...

  3. python销毁线程_聊聊 Python 中的线程

    01什么是线程? 线程是操作系统能够进行运算调度的最小单位,它隶属于进程之中,也有人叫它轻量级进程.线程自己没有系统资源,它可与同属一个进程的其它线程共享进程中的资源,同一进程中的多个线程可以并发运行 ...

  4. python 多线程卡死跳出_解决python线程卡死的问题

    1. top命令和日志方式判定卡死的位置 python代码忽然卡死,日志不输出,通过如下方式可以确定线程确实已经死掉了: # top 命令 top命令可以看到机器上所有线程的执行情况,%CPU和%ME ...

  5. python2创建3个线程_用python创建一个线程需要多长时间

    所以有两种方法可以解释你的问题: 其他在后台运行的线程(线程已经启动)是否会影响新线程的创建时间. 在这种情况下,不需要启动线程: import threading import time def f ...

  6. python中级项目下载_中级Python复习:教程,项目思想和技巧

    python中级项目下载 本文旨在向Python初学者和开发人员介绍Python中使用的一些关键概念,这些概念一开始就没有讲授. 如果您可以创建二次方根求解器,则可以理解本文. 这些是我一天之内没有学 ...

  7. python 运行程序代码_一些python程序

    <从问题到程序:用Python学编程和计算>--1.2 Python语言简介 本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第1章,第1.2节,作者 ...

  8. python大牛 关东升_《Python从小白到大牛》第4章 Python语法基础

    本章主要为大家介绍Python的一些语法,其中包括标识符.关键字.常量.变量.表达式.语句.注释.模块和包等内容. 标识符和关键字 任何一种计算机语言都离不开标识符和关键字,因此下面将详细介绍Pyth ...

  9. python 客户端应用程序_创建python Web服务和C#客户端应用程序的最佳方法 - c#

    我正在寻找一种简单可靠的方法来创建Python Web Service并从.Net(c#)应用程序中使用它. 我发现了很多不同的库,其中一个库比另一个库好,但是似乎没有人提供关于Python Web ...

  10. python之禅 中文_《Python之禅》中对于Python编程过程中的一些建议

    <Python之禅>中对于Python编程过程中的一些建议 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  <Python之禅>中对于Pyt ...

最新文章

  1. OpenVINO + OpenCV实现车辆检测与道路分割
  2. mac电脑抹掉数据要多久_macbook怎么抹掉所有的数据?
  3. 散射理论方程_非弹性中子磁散射方法简介之自旋波激发
  4. Docker的容器运行时组件Containerd
  5. python 西门子交换机_python读取交换机
  6. 【Python】实现最大最小距离算法
  7. ARM汇编指令(ARM寻址方式、汇编指令、伪指令
  8. MariaDB Audit  Statistics
  9. 《玩转Django2.0》读书笔记-编写URL规则
  10. Drool7s kmodule的作用--系列02课
  11. fspecial,imfilter
  12. 通过5个概念 一文弄明白DAO
  13. 坦克大战(Tank Battalion)------Java代码实现
  14. 拼多多商家一件代发,一键打单有什么软件?
  15. Python:实现sha1算法(附完整源码)
  16. 深入探索Android内存优化(炼狱级别)
  17. 如何链接外部JavaScript文件
  18. 资深大牛告诉你什么是架构师
  19. 一文读懂服务式办公室、共享办公室、联合办公空间、开放式工位的关系
  20. 滤波电路各种形式的分析

热门文章

  1. linux 关闭rsync服务器,linux下配置rsync服务器和实时同步
  2. 注册表修改大全(浏览文章时可以使用CTRL+F查找)
  3. java tcp聊天程序_java实现基于Tcp的socket聊天程序
  4. python语言中有3种表示字符串的方式、单引号和_Python中三种类型的引号(单引号、双引号、三引号)...
  5. 远程连接Linux服务器无法连接解决办法
  6. 将米转换为度(经纬度) 画圆上下多出来一些区域
  7. mysql-使用存储过程一次性批量创建多张表
  8. eclipse报错找不到tools.jar
  9. element ui缩小行高
  10. Kotlin入门(22)适配器的简单优化