Python通过Event方式实现线程通信
本文最后更新于 408 天前,其中的信息可能已经有所发展或是发生改变。

昨天那个题目,突然想起来最初那个人给我说应该可以用Event,上网查了查Event用法

实际上Event就是一个不带锁的Condition,同样维护着一个线程池,一个消息通知队列,可以让线程进入等待阻塞状态

那天题目的要求及使用线程锁互斥的方式实现:
Python线程互斥锁的详细理解与应用
而后使用了Condition的方式:
Python多线程Condition条件变量的理解应用

由于在此题目中,我们并不需要对一个变量写保护其实可以不必要使用锁来使线程进入同步阻塞状态,其实简单使用Event来阻塞线程就能实现简单调度。

Event支持通过:

  • isSet()函数

来判断Event是否被set

  • set()函数

来设置Event内部标志位为True

  • clear()函数

来清除Event内部标志(设置为False)

  • wait([timeout])函数

来阻塞当前线程,直到Event标志位被set

有了这些,就很容易通过Event来实现那个题目了,这真的很容易理解,因为我一遍就将代码写好,并且没有出错(相比之下Condition更复杂但是能用于更复杂的应用场合)

以下代码实现:

import threading
import time
class Counter():
    __Counter__ = 0
    def set(self,num):
        self.__Counter__ = num
    def get(self):
        return self.__Counter__

Counter = Counter()

class writer(threading.Thread):
    def __init__(self,threadName,event):
        self.event = event
        self.threadName = threadName
        threading.Thread.__init__(self,name=threadName)
    def run(self):
        event = self.event
        while True:
            if not event.isSet():
                Counter.set(Counter.get()+1)
                print ("Writer: Counter = "+str(Counter.get()))
                                # 设置Event标志位为True
                event.set()
                                # 这里面的sleep不在起着上一个方法中的重要作用,因为可以加入isSet()判断Event标志位
                time.sleep(1)

class reader(threading.Thread):
    def __init__(self,threadName,event):
        self.event = event
        self.threadName = threadName
        threading.Thread.__init__(self,name=threadName)
    def run(self):
        event = self.event
        while True:
                        # 等待writer线程setEvent变量
            event.wait()
            print ("Reader: Counter = "+str(Counter.get()))
                        # 恢复Event标志位为False,来重新使Writer来设置
            event.clear()

def main():
    event = threading.Event()
    th_reader = reader("Reader",event)
    th_writer = writer("Writer",event)
    th_writer.start()
    th_reader.start()

if __name__ == "__main__":
    main()

如果看完代码不知所云的请访问第一种实现方式,其中每一行代码都有注释,非常方便看懂。

不知道是不是还有其他方式,如果只要输出······我想到一种非常简单的方式仅供参考:

import time
i = 0
while True:
    print ("Writer: Counter = "+str(i))
    print ("Reader: Counter = "+str(i))
    i += 1
    time.sleep(1)
# 这样多简便! 逃n(*≧▽≦*)n ~

如果我要是做题也这么认真的一题多解就好了。

刘欣发起脾气还是挺大的,不知道是不是激将,反正全班都被调动起来了(不知道是不是因为“五块的冰激凌”)~

睡觉,晚安!

暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇