Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python中线程Timeout的使用

Python中线程Timeout的使用

作者头像
py3study
发布于 2020-01-06 15:19:29
发布于 2020-01-06 15:19:29
3.4K00
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

Python中关于Timeout有另一种用起来更简便的方法,即使用装饰器。这种方式是使用sys模块的settrace等方法重构了python的threading类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/python
import threading
import sys
class KThread(threading.Thread):
    """Subclass of threading.Thread, with a kill() method."""
    def __init__(self, *args, **kwargs):
        threading.Thread.__init__(self, *args, **kwargs)
        self.killed = False
    def start(self):
        """Start the thread."""
        self.__run_backup = self.run
        """Force the Thread to install our trace."""
        self.run = self.__run
        threading.Thread.start(self)
    def __run(self):
        """Hacked run function, which installs the trace."""
        sys.settrace(self.globaltrace)
        self.__run_backup()
        self.run = self.__run_backup
    def globaltrace(self, frame, why, arg):
        if why == 'call':
            return self.localtrace
        else:
            return None
    def localtrace(self, frame, why, arg):
        if self.killed:
            if why == 'line':
                raise SystemExit()
        return self.localtrace
    def kill(self):
        self.killed = True

然后,构造一个timeout装饰器,这个装饰器利用上面重载的KThread实现超时限制:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def timeout(seconds):
    def timeout_decorator(func):
        def _new_func(oldfunc, result, oldfunc_args, oldfunc_kwargs):
            result.append(oldfunc(*oldfunc_args, **oldfunc_kwargs))
        def _(*args, **kwargs):
            result = []
            '''create new args for _new_funcbecause
               we want to get the func return val to result list
            '''
            new_kwargs = {
                'oldfunc': func,
                'result': result,
                'oldfunc_args': args,
                'oldfunc_kwargs': kwargs
            }
            thd = KThread(target=_new_func, args=(), kwargs=new_kwargs)
            thd.start()
            thd.join(seconds)
            alive = thd.isAlive()
            '''kill the child thread'''
            thd.kill()
            if alive:
                alert_exce = u'function timeout for [%d s].' % seconds
                raise Timeout(alert_exce)
            else:
                return result[0]
        _.__name__ = func.__name__
        _.__doc__ = func.__doc__
        return _
    return timeout_decorator

  这种方法使用起来十分简单:只需要在需要超时控制的函数前面使用@timeout(sec)装饰器即可。

  但是这种方法有比较明显的缺陷,因为其本质是使用将函数使用重载的线程来控制,一旦被添加装饰器的函数内部使用了线程或者子进程等复杂的结构,而这些线程和子进程其实是无法获得超时控制的,所以可能导致外层的超时控制无效。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
论 Python 装饰器控制函数 Timeout 的正确姿势
1、问题背景 之前在这篇《Python RPC 远程调用脚本之 RPyC 实践》中实现过一个小 Demo,通过 RPyC 可以实现一个简单的分布式程序,但是,有过开发经验的同学应该一眼就能看出这个程序有个致命缺陷:假如用户执行了一个非常耗时或者耗资源的程序,那客户端将永远无法获取结果甚至导致服务端直接宕掉,因此我们需要对命令的执行时长做出限制,引入 Timeout 机制增强程序健壮性和用户体验。 2、so easy:装饰器! 如果你恰好看过我之前的这篇《深入浅出 Python 装饰器:16 步轻松搞定 Py
用户1177713
2018/02/24
8.3K0
掌握Python的高级用法:技巧、技术和实用性示例
Python是一门强大而灵活的编程语言,具备各种高级用法,可以帮助你更有效地编写代码、解决问题以及提高代码质量。
闻说社
2025/05/15
830
掌握Python的高级用法:技巧、技术和实用性示例
掌握 Python 文件处理、并行处理和装饰器
Python 内置的 open() 函数让文件操作变得格外轻松。以下是一种简单的打开、读取和关闭文件的方法:
闻说社
2025/05/26
440
掌握 Python 文件处理、并行处理和装饰器
Python中线程池的实现(三)
# -- coding: utf-8 -- Java 理论与实践: 线程池与工作队列: http://www.ibm.com/developerworks/cn/java/j-jtp0730/ 线程池原理及python实现: http://www.cnblogs.com/goodhacker/p/3359985.html Threadpool: http://chrisarndt.de/projects/threadpool/ http://www.cnblogs.com/coser/archive/201
用户7108768
2021/09/23
4400
Python2运行时查看线程信息
今天遇见一个 Python 问题,在测试环境中发现用 Python2.7.10 写的程序有时候会慢慢变慢,在使用 "pstack <pid>" 查看进程的时候发现起了很多的线程,并且越来越多,这肯定是程序有问题,但是使用 pstack 命令看不到具体每个线程是在做什么,于是我就想是不是可以在不影响进程运行的情况下随时查看每个线程都在干什么。 于是乎,我大致想了一下 可以使用 signal 模块在处理程序接收 kill 信号,这样我就可以使用 “kill -3 <pid>” 来给进程发信号,然后输出线程信息而
kongxx
2018/05/14
9170
Python3 多线程
主流操作系统上完成并发的手段有进程和线程,主流的编程语言提供了用户空间的调度:协程。Python 也不例外。
py3study
2020/01/02
8600
Python:线程、进程与协程(2)—
    上一篇博文介绍了Python中线程、进程与协程的基本概念,通过这几天的学习总结,下面来讲讲Python的threading模块。首先来看看threading模块有哪些方法和类吧。
py3study
2020/01/07
5890
Python:线程、进程与协程(2)—
python线程回顾
创建对象 对象 = threading.Thread(target=入口, args=(), kwargs={})
小闫同学啊
2019/07/18
4500
python 多线程特性1
         2.用来模拟生活中随机现象,比如:生产-消费问题,排队-等待问题等等;
py3study
2020/01/14
3980
【Python小技巧】信号控制与超时实现
我们在执行某个任务(例如某个算法)的时候,在某些情况下,可能耗时太长,这时可能需要进行超时控制。
明月AI
2021/10/28
9560
【Python小技巧】信号控制与超时实现
Python装饰器高级用法
在Python中,装饰器一般用来修饰函数,实现公共功能,达到代码复用的目的。在函数定义前加上@xxxx,然后函数就注入了某些行为,很神奇!然而,这只是语法糖而已。
全栈程序员站长
2021/04/07
2230
python:定时任务模块schedul
  (1)默认情况下,schedule按顺序执行所有作业。这背后的原因是很难找到一个让每个人都开心的并行执行模型
py3study
2020/01/22
1.2K0
Python装饰器的使用
简单使用 def decorator(new_func): def inner(): print("+++") new_func() return inner @decorator def show(): print("BBB") show() #结果如下: +++ BBB 装饰器带有参数的函数 def decorator(func): def inner(num1,num2): print("计算结果如下:")
hankleo
2020/09/17
5310
这样学 Python 多线程与进程(一)
众所周知,Python 中的多线程是一个假的多线程,对于多核 CPU,由于受限于 GIL 全局解释锁,同一时刻只能有一个线程在运行。
AirPython
2020/03/23
3190
这样学 Python 多线程与进程(一)
闭包和装饰器
前面学习了函数,知道了当函数调用完,函数内定义的变量都销毁了,但是我们有时候需要保存函数内的这个变量,每次在这个变量的基础上完成一系列的操作,比如:每次在这个变量的基础上和其它数字进行求和计算,那应该如何操作呢
用户9399690
2022/01/20
3660
闭包和装饰器
Python 多线程 multithr
【Python】python 多线程两种实现方式 目前python提供了几种多线程实现方式 thread,threading,multithreading ,其中thread模块比较底层,而threading模块是对thread做了一些包装,可以更加方便的被使用。 2.7版本之前python对线程的支持还不够完善,不能利用多核CPU,但是2.7版本的python中已经考虑改进这点,出现了multithreading 模块。threading模块里面主要是对一些线程的操作对象化,创建Thread的class。一般来说,使用线程有两种模式:
py3study
2020/01/06
4540
tornado 的协程调度原理
菜皮日记
2023/12/18
2030
Python技巧 | 一个任务超时退出的装饰器,用起来真方便~
我们日常在使用的各种网络请求库时都带有timeout参数,例如request库。这个参数可以使请求超时就不再继续了,直接抛出超时错误,避免等太久。
快学Python
2021/08/09
1.1K0
Python中线程同步与线程锁「建议收藏」
概念 * 线程同步,线程间协同,通过某种技术,让一个线程访问某些数据时,其他线程不能访问这些数据,直到该线程完 成对数据的操作。
全栈程序员站长
2022/08/31
7640
Python中线程同步与线程锁「建议收藏」
python模块之threading
threading模块基于Java线程模型设计。不过Java中锁和条件变量是每个对象的基本行为,在python中却是单独的对象。python的Thread类行为是Java的Thread类行为的子集,目前尚不支持优先级、线程组,线程无法销毁、停止、暂停、恢复或中断。Java中Thread类的静态方法在Python中映射为模块级的函数。
枇杷李子橙橘柚
2019/05/26
1K0
相关推荐
论 Python 装饰器控制函数 Timeout 的正确姿势
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验