python3 多线程_python3多线程中的事件Event

前面我把python3中的多线程介绍了下,那就是用threading模块来实现多线程,不过我们注意到该模块并没有提供暂停, 恢复和停止线程的方法,也就是说一旦线程对象调用start方法后,就 只能等到对应的方法函数运行完毕,可以说线程就处于失控状态了。一般为了灵活掌控线程,我们需要想办法实现线程的停止,暂停以及恢复等操作。

首先说说停止,对于线程的停止, 我们倒是可以自己实现,比如定义一个全局标志位,然后在循环中判断这个标志位, 一旦标志位被修改为预定的值, 就退出循环,也就实现了线程函数运行停止,线程也就结束了。

但是暂停和恢复线程就显得有点难了, 不是一个全局标志位能简单解决的,那么就要用到threading中Event对象了。准确的说利用Event对象的wait阻塞机制, 我们就能够实现线程的暂停和恢复了。先来看看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时间。简单的说当内部的标志位为True时,线程就不管wait(),不会阻塞,继续运行;一旦内部的标志位为False时,线程就会被阻塞,即处于暂停状态,会等到内部的标志位再次变为True的时候,线程就会恢复运行了。所以Event对象可以很好的解决线程暂停和恢复问题。

Event()主要有以下几种操作方法:

set(): 将全局标志设为True,并通知所有处于等待阻塞状态的线程恢复运行状态。

clear(): 将标志设为False,所有运行状态的线程会处于等待阻塞状态。

wait(timeout): 如果标志为True将立即返回,否则阻塞线程至等待阻塞状态,等待其他线程(一般是主线程)调用set()。

isSet(): 读取全局标志状态,返回True或False。

使用的时候,event = threading.Event()生成一个Event()对象,同时紧跟event.set(),先人为设置全局标志位为True,在我们多线程下载函数中可以添加以下语句:

while True:

if not event.isSet():#实时检测线程的event的状态

print("下载暂停,处于下载中的记录还会继续下载直到完成!")

event.wait()#判断event.isSet()是False,调用wait方法,所有线程就会处于等待状态

continue#进入死循环等待标志位

#线程恢复后要执行的语句放这里

ok,到这里,我们只要再弄个按钮,专门去改变全局标志位即可实现整个线程的暂停,继续了。改变标志位那就很简单了,调用set()就为True,调用clear()就False了。

704bbec4dd6fc4b59bf67af68bc08bb6.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值