【发布时间】:2018-04-22 15:28:22
【问题描述】:
我经常使用空的 while 循环,例如: 我有一个在后台运行的线程,它将在 5 秒内更改一个名为“a”的值。但是,我同时使用了不同的函数,我想让第二个函数知道值发生了变化,所以我一直做的是:
import threading, time
class example:
def __init__(self):
self.a = 0
def valchange(self):
time.sleep(5)
self.a += 1
time.sleep(1)
print("im changing the a value to " + str(self.a))
print("those print commands needs to run after notifier stopped his while and started printing")
def notifier(exam :example, num :int):
while(exam.a != num):
pass
print("it changed to " + str(num))
exa = example()
i = 1
while(i <= 16):
temp= threading.Thread(target=notifier, args=(exa, i, ))
temp.start()
i += 3
i = 1
while(i <= 16):
exa.valchange()
i += 1
值得一提的是,该示例不能使用等待和设置事件,因为没有指示何时需要运行设置,以及在后台运行的线程数,甚至是什么数字将有一个线程等待他们更改。 而且你也不能使用 join 因为改变'a'不是要打印的标志,只有条件才是标志。 由于最后一个原因,异步和选择也无法帮助我。
有什么方法可以创建一些东西,让程序停止运行,直到条件变为真?你可以用任何你想要的编程语言来提供你的解决方案,但我主要使用的是 python 3。
编辑:请记住,我需要它来适应各种情况。而我的代码示例 - 只是一个示例,所以如果在那里工作,它不一定会在不同的条件下工作。
提前非常感谢你:)
想法:
wait(a == 5) // will do nothing until a == 5
【问题讨论】:
-
如果您的 while 循环无限期地什么都不做,那么任何其他可能导致循环中断的代码是如何执行的?您的帖子的答案可能取决于您如何执行此操作。穿线?多处理?有很多方法可以让并行线程/进程/任何东西一起玩得很好,但一些解决方案将特定于某些模块。例如,threading.Lock 仅在您使用线程时才有用。
-
上述线程的代码在哪里?
-
@hspandher 现在好点了吗?
标签: python while-loop conditional-statements wait