[英]Python: is it possible to start and stop a while loop from another thread?
我正在尝试在另一个线程的线程中启动和停止 while 循环。 但无论我做什么,我都无法让它正常工作。 我实际上能够在另一个线程中停止 while 循环,但是我无法再次启动 while 循环。 这甚至可能吗? 从本质上讲,这似乎是一个简单的问题,但我一直无法找到正确的答案。 也许我只需要重新考虑我的代码架构? 或者我应该使用其他工具(用于线程或其他)?
这是第 1 次尝试,它可以停止 while 循环,但不能再次启动它:
import threading
import time
first_time = True
def read_sensors():
while run_event2.is_set():
run_event2.wait()
time.sleep(0.5)
print("sensor read")
def back_end():
global first_time
while run_event.is_set():
time.sleep(1)
print("back-end")
if first_time:
first_time = False
time.sleep(5)
print("clear sensors")
run_event2.clear()
time.sleep(2)
print("set sensors")
run_event2.set()
time.sleep(5)
print("clear sensors")
run_event2.clear()
time.sleep(3)
print("set sensors")
run_event.set()
run_event = threading.Event()
run_event2 = threading.Event()
run_event.set()
run_event2.set()
t1 = threading.Thread(target = read_sensors)
t2 = threading.Thread(target = back_end)
t1.start()
time.sleep(.5)
t2.start()
time.sleep(5)
try:
while 1:
time.sleep(.1)
except KeyboardInterrupt:
print("closing threads")
run_event.clear()
run_event2.clear()
t1.join()
t2.join()
print("threads successfully closed")
这是另一个代码示例,其中我使用全局变量来停止 while 循环,但我再次无法弄清楚如何再次启动 while 循环。
import threading
import time
run_event2 = True
run_event = True
def read_sensors():
global run_event2
while run_event2:
time.sleep(1)
print("run_event2 value: {0}".format(run_event2))
print("sensor read")
def back_end():
global run_event
global run_event2
while run_event:
time.sleep(1)
print("back-end")
time.sleep(5)
run_event2 = False
time.sleep(5)
run_event2 = True
t1 = threading.Thread(target = read_sensors)
t2 = threading.Thread(target = back_end)
t1.start()
time.sleep(.5)
t2.start()
time.sleep(5)
try:
while 1:
time.sleep(.1)
except KeyboardInterrupt:
print("closing threads")
run_event2 = False
run_event = False
t1.join()
t2.join()
print("threads successfully closed")
您是否正在尝试实现这种类型的 output?
如果是,请尝试在另一个中调用 function,如果不是,请手动编写您想要实现的 output。 就像在传感器关闭时调用另一个 fn 查看上述输出的修改代码
import threading
import time
run_event2 = True
run_event = True
def read_sensors():
global run_event2
while run_event2:
time.sleep(1)
print("run_event2 value: {0}".format(run_event2))
print("sensor read")
if run_event2 == False:
back_end()
def back_end():
global run_event
global run_event2
while run_event:
time.sleep(1)
print("back-end")
time.sleep(5)
run_event2 = False
time.sleep(5)
run_event2 = True
read_sensors()
t1 = threading.Thread(target = read_sensors)
t2 = threading.Thread(target = back_end)
t1.start()
time.sleep(.5)
t2.start()
time.sleep(5)
try:
while 1:
time.sleep(.1)
except KeyboardInterrupt:
print("closing threads")
run_event2 = False
run_event = False
t1.join()
t2.join()
print("threads successfully closed")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.