python - Python:是否可以从另一个线程开始和停止 while 循环?
问题描述
我正在尝试在另一个线程的线程中启动和停止 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")
解决方案
您是否正在尝试实现这种类型的输出?
如果是,请尝试在另一个函数中调用一个函数,如果不是,请手动编写您想要实现的输出。就像在传感器关闭时调用另一个 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")
推荐阅读
- javascript - 如何在 jsRender 中引用 json 对象属性?
- python - Pandas:访问列中字符串的不同方式
- excel - 如何仅从整个 Excel 工作簿中复制值而不打开它?
- javascript - 反应钩子不更新
- html - HTML 自定义框架
- javascript - 在 React Native 中显示/隐藏文本 onPress
- python - python数据结构查找跨越给定时间点的窗口
- php - 为什么我的 API 需要 2-3 秒来处理一个请求?
- go - 如何修复golang中的竞争条件?
- react-native - 如何使用 Xcode 12 Beta 4 构建 React-Native 项目?