两个线程分别做不同的操作时,有的时候需要相互发送消息。
之前我写过利用 pypubsub 完成 线程和 wxpython 界面的通信。 下面在提供一个纯线程间的通信。
场景描述如下:
线程1检测网络连接状况
线程2运行测试脚本 , 脚本进行时, 判断网络状态标识。 标识为fail 时,测试脚本进程暂停运行,直至标识为ok。
网络连接出问题的时候,线程1发送状态给线程2 。
我在线程1里设置了随机故障。
线程2 只有打印语句。
pub.subscribe 可以理解为注册一个接收消息的方法
pub.sendMessage 可以理解为发送消息给上一步注册的方法
代码里这两步的关键字是 'setstatus' , 按这样, 还可以定义多组消息发送接收。 函数可以带其他参数。 更多资料查询 pypubsub.
# encoding: utf-8
"""
@author: 陈年椰子
@contact: [email protected]
@version: 1.0
@project:test
@file: thread_test.py
@time: 2020/5/8 0008 16:46
说明 线程间通信,发送标识
"""
from threading import Thread
from time import sleep
from random import randint
from pubsub import pub
class Thread1(Thread):
def __init__(self,t_name, t_times):
"""Init Worker Thread Class."""
Thread.__init__(self)
print('\n {} Thread Start '.format(t_name))
self.times = t_times
self.name = t_name
# self.start() # start the thread
def run(self):
"""Run Worker Thread."""
# print "Check start"
for i in range(self.times+1):
if randint(1,5) == 1:
fail_time = randint(1,3)
pub.sendMessage('setstatus', status_flag='fail')
print('\n {} Thread 随机故障{}秒'.format(self.name,fail_time))
sleep(fail_time)
else:
sleep(1)
pub.sendMessage('setstatus', status_flag='ok')
print('\n {} Thread {}'.format(self.name, i))
class Thread2(Thread):
def __init__(self,t_name, t_times):
Thread.__init__(self)
print('\n {} Thread Start '.format(t_name))
self.times = t_times
self.name = t_name
self.status = 'ok'
pub.subscribe(self.change_status, 'setstatus')
def change_status(self, status_flag):
self.status = status_flag
def wait_net_work(self):
if net_work_status == 'ok':
return 'ok'
else:
for i in range(10):
sleep(1)
if net_work_status == 'ok':
return 'ok'
def run(self):
for i in range(self.times+1):
if self.status == 'ok':
print('\n {} Thread {} net_work_status {} '.format(self.name, i, self.status))
sleep(1)
else:
print('\n 发现网络故障。{} Thread 停止。 '.format(self.name ))
sleep(1)
net_work_status = 'ok'
def test():
print('start test')
t1 = Thread1('network', 20)
t1.start()
t2 = Thread2('game', 40)
t2.start()
if __name__ == '__main__':
test()
有其他的需求,欢迎和我联络。 联络方式在代码里。