为什么我的 while 循环的 'else:' 部分没有被调用?
Why is the 'else:' part of my while loop not being called?
我正在尝试使用事件对象控制 python 代码中的两个线程。在一个线程中,我等待另一个线程将事件设置为 True 并在它保持为 'True' 时执行,否则,执行其他操作。我的问题是循环的 'else' 部分永远不会被调用。任何想法为什么?非常感谢您。
我曾尝试将 'while' 语句更改为 'if' 语句,但没有成功。我真的不知道为什么这不起作用。
def send_thread(self):
rospy.loginfo('set')
self.event.set()
for cmd in sequence:
Do something
rospy.sleep(2)
rospy.loginfo('saving command in full')
self.U_full.append(self.U_single)
self.event.clear()
def receive_thread(self,msg):
while self.event.wait() == True:
Do something
else:
Do something else
预期的结果是recive_thread中的'while'部分一直运行到sending_thread中的事件清除后,才执行'else'部分.
您正在等待一个没有超时的事件,所以 self.event.wait()
总是 去 return True
。来自 threading.Event.wait()
documentation:
This method returns true if and only if the internal flag has been set to true, either before the wait call or after the wait starts, so it will always return True except if a timeout is given and the operation times out.
大胆强调我的。因为它始终 return 为真,所以您永远不会看到 else:
套件被执行。
很明显:如果不使用超时,while
循环将永远不会退出,因为没有超时,event.wait()
只会在事件发生时 return标志是 true。使用 self.event.clear()
清除标志会将标志设置为 False
,因此 event.wait()
根本不会 return.
使用超时:
while self.event.wait(0.1):
# do something while the event is still set
else:
# the event has been cleared and the timeout has been reached!
# This block can be skipped if the while block uses 'break'
注:测试self.event.wait()
即可。 == True
部分完全是多余的。此外,只有在 while
循环中使用 break
以显式跳过 else
块时,while test: ... else: ...
设置才有意义。如果您没有在 while
块中使用 break
,您也可以删除 else:
并且只 运行 无条件缩进该块中的代码。
或者,测试 event.is_set()
:
while event.is_set():
# do something while the event is still set
else:
# the event has been cleared and 'break' was not used
或者,反转事件,在开始时清除它,仅在完成时设置事件:
def send_thread(self):
rospy.loginfo('set')
self.event.clear()
for cmd in sequence:
Do something
rospy.sleep(2)
rospy.loginfo('saving command in full')
self.U_full.append(self.U_single)
self.event.set()
然后等待事件设置:
if self.event.wait():
# blocks until the event has been set by the other thread.
或者如果您想在此之前做一些事情,请在 while
循环中使用 not self.event.wait(0.1)
或简单地 not self.event.is_set()
。
我正在尝试使用事件对象控制 python 代码中的两个线程。在一个线程中,我等待另一个线程将事件设置为 True 并在它保持为 'True' 时执行,否则,执行其他操作。我的问题是循环的 'else' 部分永远不会被调用。任何想法为什么?非常感谢您。
我曾尝试将 'while' 语句更改为 'if' 语句,但没有成功。我真的不知道为什么这不起作用。
def send_thread(self):
rospy.loginfo('set')
self.event.set()
for cmd in sequence:
Do something
rospy.sleep(2)
rospy.loginfo('saving command in full')
self.U_full.append(self.U_single)
self.event.clear()
def receive_thread(self,msg):
while self.event.wait() == True:
Do something
else:
Do something else
预期的结果是recive_thread中的'while'部分一直运行到sending_thread中的事件清除后,才执行'else'部分.
您正在等待一个没有超时的事件,所以 self.event.wait()
总是 去 return True
。来自 threading.Event.wait()
documentation:
This method returns true if and only if the internal flag has been set to true, either before the wait call or after the wait starts, so it will always return True except if a timeout is given and the operation times out.
大胆强调我的。因为它始终 return 为真,所以您永远不会看到 else:
套件被执行。
很明显:如果不使用超时,while
循环将永远不会退出,因为没有超时,event.wait()
只会在事件发生时 return标志是 true。使用 self.event.clear()
清除标志会将标志设置为 False
,因此 event.wait()
根本不会 return.
使用超时:
while self.event.wait(0.1):
# do something while the event is still set
else:
# the event has been cleared and the timeout has been reached!
# This block can be skipped if the while block uses 'break'
注:测试self.event.wait()
即可。 == True
部分完全是多余的。此外,只有在 while
循环中使用 break
以显式跳过 else
块时,while test: ... else: ...
设置才有意义。如果您没有在 while
块中使用 break
,您也可以删除 else:
并且只 运行 无条件缩进该块中的代码。
或者,测试 event.is_set()
:
while event.is_set():
# do something while the event is still set
else:
# the event has been cleared and 'break' was not used
或者,反转事件,在开始时清除它,仅在完成时设置事件:
def send_thread(self):
rospy.loginfo('set')
self.event.clear()
for cmd in sequence:
Do something
rospy.sleep(2)
rospy.loginfo('saving command in full')
self.U_full.append(self.U_single)
self.event.set()
然后等待事件设置:
if self.event.wait():
# blocks until the event has been set by the other thread.
或者如果您想在此之前做一些事情,请在 while
循环中使用 not self.event.wait(0.1)
或简单地 not self.event.is_set()
。