鱼C论坛

 找回密码
 立即注册
查看: 590|回复: 8

线程间通信的问题

[复制链接]
发表于 2018-8-3 20:50:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import threading
import time

class myThreada(threading.Thread):
    def run(self):
        evt.wait()
        print(self.name,':Good morning!')
        #evt.clear()
        time.sleep(1)
        #evt.set()
        time.sleep(1)
        evt.wait()
        print(self.name,":i'm fine,thank you.")

class myThreadb(threading.Thread):
    def run(self):
        print(self.name,":good moring!")
        evt.set()
        time.sleep(1)
        evt.wait()
        print(self.name,":how are you?")
        #evt.clear()
        time.sleep(1)
        #evt.set()

evt = threading.Event()
def main():
    John = myThreada()
    John.name = 'John'
    Smith = myThreadb()
    Smith.name = 'Smith'
    John.start()
    Smith.start()
if __name__ == "__main__":
    main()

取消了注释代码行的注释的和不取消注释得到的结果一样。
对于这段代码。当wait阻止当前线程后,我觉得set()一次就可以保证线程间互相通信了啊。
既然wait是要得到True后才能释放线程让线程继续,那么设置一次set()就可以了啊。
为什么还要设置clear()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-3 21:00:07 | 显示全部楼层
那个evt是拿来同步的,假如注释掉可能会出点问题。
线程2有一个set的动作,线程1有一个wait的动作,这样线程1就会被阻塞到线程2set为止(这样它们说早上好的顺序就能固定)
线程2说完goodmorning之后进入了wait状态,同时线程1把evt clear掉了(这时线程2被阻塞)。
接着线程1休眠2(1+1)秒,第一次休眠后设置evt,这时线程2从阻塞中恢复,说how are you,正好0.9秒左右之后线程1休眠完毕,打印i'm fine thank you。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-3 21:08:54 | 显示全部楼层
无符号整形 发表于 2018-8-3 21:00
那个evt是拿来同步的,假如注释掉可能会出点问题。
线程2有一个set的动作,线程1有一个wait的动作,这样线 ...

但是注释掉后
线程2说了 good morning后设置set()
这时候wait()线程2被阻塞
线程1 说 good morning
到线程1的wait()
由于只线程1已经设置了set()之后情况都为true,
线程2 输出 how are you接着
同理线程1 输出 i‘m fine。
我觉得也没有什么问题啊。

你说的出问题的情况能举例一种吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-4 10:14:30 | 显示全部楼层
有没有大佬解释解释呐
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-4 11:54:39 | 显示全部楼层
ErTian 发表于 2018-8-3 21:08
但是注释掉后
线程2说了 good morning后设置set()
这时候wait()线程2被阻塞

是啊,这个只是一个例子,向你演示event是怎么工作的。
无论你是否注释掉程序的运行都一样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-4 12:34:16 | 显示全部楼层
无符号整形 发表于 2018-8-4 11:54
是啊,这个只是一个例子,向你演示event是怎么工作的。
无论你是否注释掉程序的运行都一样。

不会啊。虽然是个例子,
但是还是由逻辑的啊。
不可能说我注释不注释都没关系的把。
就像我一来就把set()注释掉。那不就死锁了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-4 12:41:48 | 显示全部楼层
ErTian 发表于 2018-8-4 12:34
不会啊。虽然是个例子,
但是还是由逻辑的啊。
不可能说我注释不注释都没关系的把。

谁说的,你少注释了一个。
在mythreadb里面。
这样还是会set,这样后面的顺序都是由time.sleep来指挥了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-4 18:57:31 | 显示全部楼层
无符号整形 发表于 2018-8-4 12:41
谁说的,你少注释了一个。
在mythreadb里面。
这样还是会set,这样后面的顺序都是由time.sleep来指挥了 ...


你说的是否注释都一样运行。
那不意味着除了一开始set()后面设置的true和false都是白写的。
那为何不直接只设置一个set()。实例却给那么多无作用代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-4 18:59:32 | 显示全部楼层
ErTian 发表于 2018-8-4 18:57
你说的是否注释都一样运行。
那不意味着除了一开始set()后面设置的true和false都是白写的。
那为何不 ...

注释和不注释还是有一点区别的。
不注释的话真实一些,应答会慢一些。
当然,假如你注释掉所有set,还是会死锁的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 02:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表