首页 > 解决方案 > 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")

标签: pythonmultithreadingwhile-loop

解决方案


您是否正在尝试实现这种类型的输出?

在此处输入图像描述

如果是,请尝试在另一个函数中调用一个函数,如果不是,请手动编写您想要实现的输出。就像在传感器关闭时调用另一个 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")

推荐阅读