Python 多线程 Thread (三):巧用Flag实现线程间交互,暂停,停止等控制

Python 多线程 Thread(一):如何构造新的线程
Python 多线程 Thread(二):Thread 类的几种方法

Python 的 Threading 类本身没有暂停,停止的控制方法,要实现这些功能的话可以在run方法中添加一系列的 标志(Flag)检查来实现。
需要注意的是,用这种方法实现的暂停或者停止并非即时生效的,它需要等该线程运行到检查命令时方能生效。如果要使其反应更迅速,你可以添加尽可能多的检查命令。

举例:
线程一:开始运行后将计算 1+2+3+…+100 并返回结果,线程二:控制线程一的暂停与停止。

import threading
import time
import keyboard
## self.flag 这里设置为 0,1,2 分别代表 正常,暂停,停止
class Thread1(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.flag=1 #初始默认暂停
    def run(self):
        temp = 0
        for i in range(101):
            if(self.checkflag()==2):  #如果停止,直接退出loop
                break
            temp += i
            string="i:"+str(i)+" result:"+str(temp)+"\n"
            print(string)  #print 输出每个循环结果来检查            
    def setflag(self,value):	#setflag 函数用于外部修改flag
        self.flag=value
    def checkflag(self):	#flag 检查函数
        if self.flag==0:	#如果flag=0,返回0,继续计算
            return 0
        if self.flag==1:	#如果flag=1,开始另一个循环,保持检查flag,直到flag值变化
            while self.flag==1:
                time.sleep(1)
            self.checkflag()	#这里退出了上一个循环,需要判断当前的flag是 0 还是 2.
        if self.flag==2:	#如果flag=2,则返回2,线程退出loop
            return 2
            
#这里用了键盘事件来实现监听以及setflag 的实现(因为用input实现的效果不好)        
class Thread2(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):	#keyboard的用法这里不展开说明
        while True:
            keyboard.hook(self.listen) #绑定键盘事件
            keyboard.wait()
    def listen(self,event):
        #事件判断,不同按键设置不同flag
        if event.event_type=='down' and event.name=='0':
            T1.setflag(0)
        if event.event_type=='down' and event.name=='1':
            T1.setflag(1)
        if event.event_type=='down' and event.name=='2':
            T1.setflag(2)
#启动线程
T1=Thread1()
T2=Thread2()
T2.start()
T1.start()

基于这个逻辑,基于网络,蓝牙的监听发送也可以实现了。
服务器持续进行抓包监听(线程二),当发现满足触发条件的数据包时,激活其它对应功能的线程(线程一)(这种情况下不一定需要暂停或者停止的方法,简单的进行Tn.start()或许就可以满足,具体情况具体讨论)
线程一:发送特定数据包。
线程二:监听,判断满足条件激活线程一。

在数据交互的过程中,可能有不同的阶段,可以通过设定不同的flag,来通过线程一发送不同的数据包,或者设置多个线程。

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页