利用pypubsub 进行python线程间通信。

两个线程分别做不同的操作时,有的时候需要相互发送消息。

之前我写过利用 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()

有其他的需求,欢迎和我联络。 联络方式在代码里。

你可能感兴趣的:(Python)