Python用threading模板中的Event对象实现对线程的控制

  对通过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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值