我有一个使用2个线程的应用程序。我希望能够通过等待条件变量exitCondition
关闭这两个线程。我使用的是python3.3,它与python2.7不同,它使threading.Condition.wait()
在通知条件时返回{
#!/usr/bin/python
import threading
from time import sleep
exitCondition = threading.Condition()
def inputActivity():
while True:
exitCondition.acquire()
exitConditionReached = exitCondition.wait(.1) #<-critical
print(exitConditionReached)
exitCondition.release()
if exitConditionReached: #exitCondition reached -> shutdown
return
else: #exitCondition not reached -> do work
sleep(.1)
inThread = threading.Thread(target = inputActivity)
inThread.start()
sleep(.2) #<-critical
exitCondition.acquire()
exitCondition.notify()
print("exitCondition notified")
exitCondition.release()
inThread.join()
在第10行和第21行有2行带有#<-critical
注释。如果sleep
是“未对齐”(例如.25和.1),程序将终止。如果sleep
是“对齐的”(例如.2和.1),inThread
将无限期地运行false
永远打印。对我来说,这看起来像是一个竞争条件,显然如果notify
与wait
同时被调用,则通知无法被识别。我的印象是exitCondition.acquire()
和{wait(0)
,并保证不会吞下任何通知。在
如果对}调用之外的任何地方),那么您描述的行为听起来就像我所期望的那样。只有在通知发生在
exitCondition.notify
的调用发生在工作线程执行工作时(即在sleep(.1)
调用中(或在{wait
期间时,wait
调用才会返回True
。在在我看来,这似乎是一个}调用(在两个线程中)。在
threading.Event
而不是threading.Condition
:将threading.Condition
替换为threading.Event
,将notify
调用替换为set
调用,并删除acquire
和{也就是说,代码应该如下所示:
一旦完成了这一步,就不需要第一个
^{pr2}$.wait
:可以用一个直接的is_set
调用来替换它,以查看是否已经设置了退出条件:相关问题 更多 >
编程相关推荐