繁体   English   中英

Python:是否可以从另一个线程启动和停止 while 循环?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM