Python中线程的使用(停止操作)

对通过threading模块创建新python的thread模块是比较底层的模块,python的threading模块是对thread做了一些封装,可以更加方便的被使用。
     模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. 对于函数中没有循环,可以使用join()来结束循环。
方法一:一般的方法就是循环地判断一个标志位, 一旦标志位到达到预定的值, 就退出循环. 这样就能做到退出线程了.  直到我看到threading中Event对象。对于event.isSet()可以查看event的状态,set()函数返回为True,clear()函数返回为False。
self.__flag.wait()  中self.__flag为True时立即返回, 为False时阻塞直到self.__flag为True后返回

    #!/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时阻塞直到self.__flag为True后返回
                print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
                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(2)
    # a.stop()

方法二:1.信号量
        也提供acquire方法和release方法,每当调用acquire方法的时候,如果内部计数器大于0,则将其减1,如果内部计数器等于0,则会阻塞该线程,知道有线程调用了release方法将内部计数器更新到大于1位置。class threading.Sempaphore(value = 1) --限制资源的并发访问。semaphore 是一个内部的计数器,它会随着acquire()的请求减小,也会随着release()的
释放增加。这个计数器的值不会小于零,当acquier() 发现计数器的值为0时,那么当前
对象会等待直到其他对象release()为止。acquier(blocking = True ,timeout = None)
release()

 

对于Thread方法的基本使用
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
这个构造函数通常会用一些关键字参数,下面就了解下这些关键字:
     group :这个变量作为保留变量,是为了以后扩展用的,暂时可以不用考虑。
     target: 是通过run()方法调用的可调用对象。默认为无,这意味着什么都不做。
     name:线程的名字。默认情况下,一个唯一的名称是”thread-n”,的形式,其中n是一个小的十进制数。
     args:元组参数,为target所调用的。
     kwargs:关键字参数的字典,为target所调用的。
     daemon: 设置daemon是否daemon 如果没有显示设置,daemon的属性时从当前线程继承。
————————————————
版权声明:本文为CSDN博主「猥琐发育」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33540705/article/details/90232209

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值