精华内容
下载资源
问答
  • python线程退出

    2020-11-23 18:31:03
    python的多线程中是没有退出方法的,但是在实际中经常需要退出某个写死的程序,在这个时候使用ctrl+c显得有些不妥。 标志位实现 在百度中找到的方法有抛出异常还有改写类方法做标志位的实现,但是都觉得略微麻烦,故...

    前言

    python的多线程中是没有退出方法的,但是在实际中经常需要退出某个写死的程序,在这个时候使用ctrl+c显得有些不妥。

    标志位实现

    在百度中找到的方法有抛出异常还有改写类方法做标志位的实现,但是都觉得略微麻烦,故采取设置变量进行判断。
    demo代码:

    import threading
    
    class Test:
        def __init__(self):
            self.signal = 1 #定义标志位
        def test1(self):
            while True:
                print(1)
                if self.signal==0:#判断标志位是否为0,为0就退出
                    print('退出')
                    break
        def test2(self):
            print(2)
            self.signal = 0
    
        def main(self):
            threading.Thread(target=self.test1).start()
            threading.Thread(target=self.test2).start()
    
    if __name__ == '__main__':
        run = Test()
        run.main()
    

    标志位改进,使用daemon守护进程

    在上述标志位退出线程中,还存在着弊端,需要等待线程完成后才可以退出,不可以马上就退出,如果是在等待事件中耗费的时间就有点多余了,在此之下可以使用dameon这么属性来进行调整。

    daemon

    1.在python运行时有一个主线程,主线程结束时对子线程的daemon进行检测
    2.daemon值为False时,主线程结束并对这个子线程进行检查,如果子线程未执行完成,主线程会等待子线程执行完成再退出
    3.daemon值为True时,主线程结束时不检查这个子线程直接结束,且子线程不论执行是否完成,都会随着主线程结束而结束

    注意:daemon值需要在start()前进行修改,默认为False,在IDLE时主线程在退出IDLE才为结束

    demo代码:

    class Test:
        def __init__(self):
            self.signal = 1
    
        def test1(self):
                time.sleep(30)
    
        def test2(self):
            print(2)
            self.signal = 0
            print('执行完毕')
    
        def main(self):
            t1 = threading.Thread(target=self.test1)
            t2 = threading.Thread(target=self.test2)
            t1.setDaemon(True)#t1随着主线程结束而结束
            t1.start()
            t2.start()
    
    if __name__ == '__main__':
        run = Test()
        run.main()
    
    

    线程t1等待30s
    线程2执行完后主线程执行到末尾,不会等待t1完全执行完毕,主线程执行完后直接结束掉t1

    展开全文
  • python 线程退出方法

    千次阅读 2020-03-19 14:22:20
    FIFO是常用的队列,其一些常用的方法有:  Queue.qsize() 返回队列... Queue.get([block[,timeout]]) 从队列头删除并返回一个item,block默认为True,表示当队列为空却去get的时候会阻塞线程,等待直到有有ite...

    FIFO是常用的队列,其一些常用的方法有:

        Queue.qsize()  返回队列大小

        Queue.empty()  判断队列是否为空

        Queue.full()  判断队列是否满了

        Queue.get([block[,timeout]])  从队列头删除并返回一个item,block默认为True,表示当队列为空却去get的时候会阻塞线程,等待直到有有item出现为止来get出这个item。如果是False的话表明当队列为空你却去get的时候,会引发异常。在block为True的情况下可以再设置timeout参数。表示当队列为空,get阻塞timeout指定的秒数之后还没有get到的话就引发Full异常。

        Queue.put(...[,block[,timeout]])  向队尾插入一个item,同样若block=True的话队列满时就阻塞等待有空位出来再put,block=False时引发异常。同get的timeout,put的timeout是在block为True的时候进行超时设置的参数。

        Queue.task_done()  从场景上来说,处理完一个get出来的item之后,调用task_done将向队列发出一个信号,表示本任务已经完成

        Queue.join()  监视所有item并阻塞主线程,直到所有item都调用了task_done之后主线程才继续向下执行。这么做的好处在于,假如一个线程开始处理最后一个任务,它从任务队列中拿走最后一个任务,此时任务队列就空了但最后那个线程还没处理完。当调用了join之后,主线程就不会因为队列空了而擅自结束,而是等待最后那个线程处理完成了。

    线程退出可以设置标志位,使用队列获取数据的线程可以将queue.get设置阻塞超时。

     一个简单的由队列获取数据的线程的如何退出的例子:

    import queue
    import sys 
    import threading
    
    def worker(name, q, exit_flag):
        while not exit_flag.is_set():
            try:
                # 超时控制,便于及时响应exit_flag
                item = q.get(timeout=3)
            except queue.Empty:
                continue
            print('thread {}, item {}'.format(name, item), file=sys.stderr)
            q.task_done()
    
    def main():
        # 线程退出标志位
        exit_flag = threading.Event()
        exit_flag.clear()
    
        # 创建共享队列和线程池
        q = queue.Queue()
        num_of_threads = 5 
        threads = [threading.Thread(target=worker, args=(str(i+1), q, exit_flag))
                   for i in range(num_of_threads)]
        for t in threads:
            t.start()
        for i in range(50):
            q.put(i)
        q.join()
    
        # 任务处理完成,通知线程退出,并join等待
        exit_flag.set()
        for t in threads:
            t.join()
            
    if __name__ == '__main__':
        main()

     

    展开全文
  • python-线程的暂停, 恢复, 退出

    千次阅读 2016-12-05 10:31:00
    我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. ...

      我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. 不过, 我们可以自己实现这些. 一般的方法就是循环地判断一个标志位, 一旦标志位到达到预定的值, 就退出循环. 这样就能做到退出线程了. 但暂停和恢复线程就有点难了, 我一直也不清除有什么好的方法, 直到我看到threading中Event对象的wait方法的描述时.

    wait([timeout])
    
        Block until the internal flag is true. If the internal flag is true on entry, return immediately. Otherwise, block until another thread calls set() to set the flag to true, or until the optional timeout occurs.
    
        阻塞, 直到内部的标志位为True时. 如果在内部的标志位在进入时为True时, 立即返回. 否则, 阻塞直到其他线程调用set()方法将标准位设为True, 或者到达了可选的timeout时间.
    
    
        When the timeout argument is present and not None, it should be a floating point number specifying a timeout for the operation in seconds (or fractions thereof).
    
        This method returns the internal flag on exit, so it will always return True except if a timeout is given and the operation times out.
    
        当给定了timeout参数且不为None, 它应该是一个浮点数,以秒为单位指定操作的超时(或是分数)。
    
        此方法在退出时返回内部标志,因此除非给定了超时且操作超时,否则它将始终返回True。
    
    
        Changed in version 2.7: Previously, the method always returned None.
    
        2.7版本以前, 这个方法总会返回None.

     

     

      利用wait的阻塞机制, 就能够实现暂停和恢复了, 再配合循环判断标识位, 就能实现退出了, 下面是代码示例:

     

    #!/usr/bin/env python
    # coding: utf-8
    
    import threading
    import time
    
    
    class Job(threading.Thread):
    
        def __init__(self, *args, **kwargs):
            super(Job, self).__init__(*args, **kwargs)
            self.__flag = threading.Event()     # 用于暂停线程的标识
            self.__flag.set()       # 设置为True
            self.__running = threading.Event()      # 用于停止线程的标识
            self.__running.set()      # 将running设置为True
    
        def run(self):
            while self.__running.isSet():
                self.__flag.wait()      # 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回
                print time.time()
                time.sleep(1)
    
        def pause(self):
            self.__flag.clear()     # 设置为False, 让线程阻塞
    
        def resume(self):
            self.__flag.set()    # 设置为True, 让线程停止阻塞
    
        def stop(self):
            self.__flag.set()       # 将线程从暂停状态恢复, 如何已经暂停的话
            self.__running.clear()        # 设置为False    

     

    下面是测试代码:

    a = Job()
    a.start()
    time.sleep(3)
    a.pause()
    time.sleep(3)
    a.resume()
    time.sleep(3)
    a.pause()
    time.sleep(2)
    a.stop()

     

    测试的结果:

     

     

      这完成了暂停, 恢复和停止的功能. 但是这里有一个缺点: 无论是暂停还是停止, 都不是瞬时的, 必须等待run函数内部的运行到达标志位判断时才有效. 也就是说操作会滞后一次.

      但是这有时也不一定是坏事. 如果run函数中涉及了文件操作或数据库操作等, 完整地运行一次后再退出, 反而能够执行剩余的资源释放操作的代码(例如各种close). 不会出现程序的文件操作符超出上限, 数据库连接未释放等尴尬的情况.

     

    转载于:https://www.cnblogs.com/scolia/p/6132950.html

    展开全文
  • 2.使用isAlive()函数判断所有子线程是否完成,而不是在主线程中用join()函数等待完成; 3.写一个响应Ctrl+C信号的函数,修改全局变量,使得各子线程能够检测到,并正常退出。 源码 #!/usr/bin/env python #encoding...
  • python线程

    2017-06-16 10:12:08
    参考:《Python cookbook》12章启动和停止线程start 启动线程;is_alive 判断是否已经结束;join 请求连接某个线程, 等待该线程结束,才退出join函数;daemon参数, 守护线程,该线程无法被连接,主线程结束后自动...

    参考:《Python cookbook》12章

    启动和停止线程

    start 启动线程;

    is_alive 判断是否已经结束;

    join 请求连接某个线程, 等待该线程结束,才退出join函数;

    daemon参数, 守护线程,该线程无法被连接,主线程结束后自动销毁。(2.7不适用)

    终止线程:

    需要自己构建终止操作, 一般在while循环中添加标识符来判断是否需要停止线程。

    一个demo, 当terminate()后,线程即退出

    1240


    Event

    event 可以实现线程间的通信, 比如这样的情况:线程t1必须在线程t2执行完以后再执行(例如,数据库操作的线程必须等到数据库连接上以后再执行),这时用event可以达到这样的效果


    多线程模式下,操作同一数据的时候,需要进行同步控制,否则容易对数据造成破坏。

    threading模块提供的Lock类,可以实现某一时刻只有一个线程操作某个数据对象:

    ```

    #创建锁

    mutex = threading.Lock()

    #锁定

    mutex.acquire([timeout])

    #释放

    mutex.release()

    ```

    其中acquire函数的timeout参数,是指在timeout指定的时间后会通过返回值判断,从而进行一些其他操作。


    死锁: 

    在上述mutex.acquire()以后,还没有release以前,又进行acquire操作,这时就会出现死锁的情况。在代码逻辑比较复杂的项目中,某一些函数里面很容易出现这样的情况,引发死锁。

    threading模块还有另外一个类:Rlock,可重入锁,不会发生死锁的情况,但是要保证一次acquire对应一次release。

    另外,可以用语句: with mutex: 代替 mutex.acquire()和mutex.release().

    展开全文
  • python 线程 暂停, 恢复, 退出 我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦...
  • 这里写自定义目录标题第一种:Python线程的默认情况(设置线程setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束第二种:开启线程的setDaemon(True...
  • Python线程通信问题

    2020-01-18 09:20:58
    新人第一次提问, 最近在学习Python线程, notify()与wait()语句。这是我写的一个作业, 要求是: 现在的你,是一个农场主。农场中养着10头小牛,牛吃草长大,但只有当下雨的时候草才会长大,每天有20%的概率下雨,草...
  • 我们可以自己实现python线程控制. 一般的方法就是循环地判断一个标志位, 一旦标志位到达到预定的值, 就退出循环. 这样就能做到退出线程了. 但暂停和恢复线程就有点难了, 我一直也不清除有什么好的方法, 直到我看到...
  • 对通过threading模块创建新python的thread模块是比较底层的模块,python的threading模块是对thread...方法一:一般的方法就是循环地判断一个标志位, 一旦标志位到达到预定的值, 就退出循环. 这样就能做到退出线程了...
  • python线程下的信号处理程序示例

    千次阅读 2015-06-27 07:25:43
    python线程中要响应Ctrl+C的信号以杀死整个进程,需要: 1.把所有子线程设为Daemon; 2.使用isAlive()函数判断所有子线程是否完成,而不是在主线程中用join()函数等待完成; 3.写一个响应Ctrl+C信号的函数,修改...
  • 使用isAlive()函数判断所有子线程是否完成,而不是在主线程中用join()函数等待完成; 写一个响应Ctrl+C信号的函数,修改全局变量,使得各子线程能够检测到,并正常退出。 花了一天时间用python为服务写了个压力...
  • 如果用户按下Ctrl+C或Ctrl+D则退出程序 如果用户输入非数字字符,提示用户应该输入数字 如果用户输入0,提示用户0不能作为除数 方案: 使用if语句判断除数是否合适,需要编写多条语句。有了异常处理,可以...
  • 我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. ...
  • 尹成Python27天入门到项目实战

    千人学习 2020-12-05 17:04:22
    多进程多线程综合实战读取CSV写入csv单线程统计行数多线程统计行数多进程统计行数多线程检索数据第一步多线程检索赵琳多线程检索找到通知其他人退出线程检索开放数据并保存同一个文件作业day24up ...
  • python实现网站目录扫描 大致流程确定如下: Created with Raphaël 2.2.0程序开始打印banner信息打印使用方法接收传递过来的参数判断参数是否接收完整(是或否?)打印错误信息直接退出程序没有接收完整yesno 根据...
  • python-program

    2016-08-05 17:08:00
    程序需要一步步改进,解决bug,尽量从源头判断,并给出处理措施。 1.客户端执行一次,程序就退出, 2.客户端空值,错误命令,程序会死掉 3.收发缓冲区大小,即recv(1024)的问题,如果收一个100M的文件就又是问题 ...
  • 通过 threading.Thread.is_active 判断线程是否退出。 此方法可以用来对程序进行监听,当程序出现异常退出,重启程序。 ''' class MyThread(threading.Thread): def __init__(self, threadID, name, func, ...
  • Python 扫描存活主机

    2018-06-30 17:50:52
    案例4:利用多线程实现ssh并发访问 1 案例1:简化除法判断1.1 问题 编写mydiv.py脚本,主要要求如下: 提示用户输入一个数字作为除数 如果用户按下Ctrl+C或Ctrl+D则退出程序 如果用户输入非数字字符,提示用户应该...
  • 使用IDLE - 交互式环境(REPL) / 编写多行代码 / 运行程序 / 退出IDLE 注释 - 注释的作用 / 单行注释 / 多行注释 Day02 - 语言元素 程序和进制 - 指令和程序 / 冯诺依曼机 / 二进制和十进制 / 八进制和十六进制 ...
  • 最近在使用python建立socket多线程通讯,对于判断对端是否在线,没有active这个属性。 查询网上的资料,data = socket.send(msg),if not data:或者if (len(data) == 0):,当客户端异常断开的时候,还是会导致...
  • 例子创建多线程处理策略逻辑时时,会对Market库重复初始化做处理,需要Python部分代码做自行修改(例如将初始化改为局部变量),否则market建立多线程时 将每一个线程都讲重复初始化1次行情。 2016.11.14 ...
  • 线程退出 QtQuick Flat样式 QML与Python交互 QtChart 折线图 折线堆叠图 柱状堆叠图 LineChart自定义xy轴 ToolTip提示 DynamicSpline动态曲线图 区域图表 柱状图表 饼状图表 样条图表 百分比柱状图表 横向...
  • sesvc.exe 阿萨德

    2019-06-02 17:11:12
    Python C# Node.Js 一文让你彻底理解 Java HashMap 和 ConcurrentHashMap 2018-07-25 分类:JAVA开发、编程开发、首页精华0人评论 来源:crossoverjie.top 分享到:更多0 前言 Map 这样的 Key Value 在软件开发...
  • 使用CycriptTricks(Powerful_private_methods)、hookClass_knhook_hookClassLog、UIButton_sendActionsForControlEvents、DerekSelander_LLDB(Python scripts to aid in your debugging sessions)、frida 进行动态...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

python判断线程退出

python 订阅