Python 中的轮询

问题描述 投票:0回答:1

这是我想要的功能:

我想监听本地主机上的变量,比如说状态 1 和状态 2。我希望我的主脚本执行函数 b,但是如果它通过本地主机接收到状态 1,我希望它中断任何状态做(几乎像 control-c),并开始执行函数 A。

我的问题是轮询,我似乎无法让两者独立工作,它正在等待函数 b 的执行完成,然后再检查本地主机上的状态是否已更改。

本质上,我希望该函数检查状态是否已更改以及是否需要切换并行执行的内容。

任何人都可以指导我正确的方向或指出我的错误吗?

旁注:为了简单起见,我现在正在模拟状态的变化。


import random
import threading
import time

state_lock = threading.Lock()
current_state = 1  # 1 for normal state, 2 for fall detected state
fall_detected = False


# Function for the normal task
def normal_task():
    global current_state
    task_duration = 20  
    elapsed = 0
    while elapsed < task_duration:
        with state_lock:
            if current_state == 1:
                print("Normal Task")
                time.sleep(1) 
                elapsed += 1  
            else:
                print("Fall detected")
                break  
        
def fall_task():
    global current_state
    while True:
        with state_lock:
            if current_state == 2:
                print("Executing Fall Detected")
                time.sleep(2)  
                current_state = 1
                print("Fall handled")
                break  
        time.sleep(0.5)

# Function to simulate fall detection signal and switch states
def fall_detection_signal():
    global current_state, fall_detected
    previous_time = time.time()  
    while True:
        current_time = time.time()  
        elapsed_time = (
            current_time - previous_time
        )  
        previous_time = current_time  
        print(f"Time since last fall detection check: {elapsed_time:.2f} seconds")
        time.sleep(
            random.uniform(5, 10)
        )  # Simulate random time for fall detection check
        with state_lock:
            fall_detected = True
            current_state = 2
            print("Fall Detected! Switching state to Fall Detected.")
        time.sleep(5)  
        fall_detected = False


normal_task_thread = threading.Thread(target=normal_task)
fall_detection_thread = threading.Thread(target=fall_detection_signal)

normal_task_thread.start()
fall_detection_thread.start()

while True:
    if fall_detected:
        fall_task_thread = threading.Thread(target=fall_task)
        fall_task_thread.start()
        fall_task_thread.join()

    if current_state == 1:
        normal_task_thread = threading.Thread(target=normal_task)
        normal_task_thread.start()
        normal_task_thread.join()
python multithreading polling robotics
1个回答
0
投票

在进行了更多实验并考虑 python 2.7 之后,我想说在检测到标志时中断另一个线程的执行是不可能的。通过使用单个脚本,您可以做的最好的事情就是让它轮询一个变量,并在上一个任务/状态完成后简单地切换执行。您几乎需要一个线程来控制(中断)另一个线程,以便它根据检测到的变量立即切换正在执行的线程。

© www.soinside.com 2019 - 2024. All rights reserved.