因此,我编写了简单的测试代码,并尝试执行两次事件,但它只工作了一次。在turn_left_e.set()之后,我使用turn_left_e.clear()清除内部标志(我也在代码中检查它),并第二次尝试执行事件,但它不会启动。这是我的代码:
import time
from multiprocessing import Event, Process
def check_light_dir(turn_left_e, turn_right_e):
while True:
time.sleep(2)
var = random.randint(1, 10)
print(f"var: {var}")
if var < 5:
print(f"turn_left_e before set(): {turn_left_e.is_set()}")
turn_left_e.set()
else:
print(f"turn_right_e before set(): {turn_right_e.is_set()}")
turn_right_e.set()
def turn_left(turn_left_e):
turn_left_e.wait()
print(f"turn_left_e after set(): {turn_left_e.is_set()}")
print("Turning servo left")
turn_left_e.clear()
print(f"turn_left_e after clear(): {turn_left_e.is_set()}")
def turn_right(turn_right_e):
turn_right_e.wait()
print(f"turn_right_e after set(): {turn_right_e.is_set()}")
print("Turning servo right")
turn_right_e.clear()
print(f"turn_right_e after clear(): {turn_right_e.is_set()}")
def test():
turn_right_e = Event()
turn_left_e = Event()
check_light_dir_p = Process(target=check_light_dir, args=(turn_left_e, turn_right_e,))
turn_right_p = Process(target=turn_right, args=(turn_right_e,))
turn_left_p = Process(target=turn_left, args=(turn_left_e,))
check_light_dir_p.start()
turn_left_p.start()
turn_right_p.start()
check_light_dir_p.join()
turn_right_p.join()
turn_left_p.join()
if __name__ == "__main__":
print("start")
test()
print("stop")输出:
start
var: 4
turn_left_e before set(): False
turn_left_e after set(): True
Turning servo left
turn_left_e after clear(): False
var: 10
turn_right_e before set(): False
turn_right_e after set(): True
Turning servo right
turn_right_e after clear(): False
var: 9
turn_right_e before set(): False
var: 10
turn_right_e before set(): True
var: 2
turn_left_e before set(): False
var: 5
turn_right_e before set(): True
Process finished with exit code -1所以第一次和第二次迭代伺服移动。有趣的部分从这里开始:在第3次迭代中“set()之前”是假的,在第4次“set()之前”是真的!它似乎触发事件,但没有跳进去-从来没有第二打印“伺服移动.”内部标志被无限地设置为True。
我不明白为什么会发生这种事。我清楚()事件,所以只要条件满足,它们就应该触发,对吗?
发布于 2022-07-07 21:43:12
问题是,函数turn_left和turn_right在第一个事件集和它们的进程结束后退出。将while True:放入其中:
...
def turn_left(turn_left_e):
while True: # <--------
turn_left_e.wait()
print(f"turn_left_e after set(): {turn_left_e.is_set()}")
print("Turning servo left")
turn_left_e.clear()
print(f"turn_left_e after clear(): {turn_left_e.is_set()}")
def turn_right(turn_right_e):
while True: # <--------
turn_right_e.wait()
print(f"turn_right_e after set(): {turn_right_e.is_set()}")
print("Turning servo right")
turn_right_e.clear()
print(f"turn_right_e after clear(): {turn_right_e.is_set()}")
...https://stackoverflow.com/questions/72904441
复制相似问题