Python多线程之多重循环暂停暂停线程

情景

做了一个自动化脚本,添加多线程功能时(为了省去开多个VScode窗口)遇到一个问题,如何在多重循环中暂停子进程(就如VScode的暂停运行代码),方便遇到突发情况时人工处理
线程的代码大概如下

def test():
  while True: #这里是主循环,让整个流程持续进行
    while True: #中间会时不时加入循环,等待某个时机出现(这里的循环可能还会嵌套循环)
      if a==0: # 这里举个例子
        print("a")
        break
    while True: 
      if b==0: 
        print("b")
        break

尝试

我查阅网上,得知有通过join(),全局变量等方法进行停止线程,但是我总不能把每个循环都进入判断吧

需求

我在想有没有在主线程暂停子线程,并可以恢复原本子线程的方法

【以下回答由 GPT 生成】

首先回答问题1,是的,有一种方法可以在主线程中暂停子线程。可以使用线程间的通信来实现这个目标。

一种常见的方法是使用事件对象(Event),主线程通过设置事件来暂停子线程的执行,子线程在执行之前会先检查事件是否被设置,如果被设置,则暂停执行。

下面是一个示例代码:

import threading

# 创建事件对象
pause_event = threading.Event()

def test():
    while True:
        # 在每个循环开始前检查事件状态
        pause_event.wait()
        if a == 0:
            print("a")
            break

# 创建并启动子线程
thread = threading.Thread(target=test)
thread.start()

# 主线程执行的代码
# 在某个地方设置事件来暂停子线程
# 比如,可以在紧急情况发生时设置事件
def handle_emergency():
    # 设置事件来暂停子线程
    pause_event.set()
    # 执行紧急处理逻辑...

# 在紧急情况发生时调用处理函数
handle_emergency()

# 在某个地方恢复子线程的执行
pause_event.clear()  # 清除事件,让子线程继续执行

通过调用pause_event.set()来设置事件,可以暂停子线程的执行。通过调用pause_event.clear()来清除事件,可以恢复子线程的执行。

接下来回答问题2,是的,有方法可以在主线程中控制多个子线程的执行。可以使用相同的事件对象来控制多个子线程。

下面是一个示例代码:

import threading

# 创建事件对象
pause_event = threading.Event()

def test1():
    while True:
        # 在每个循环开始前检查事件状态
        pause_event.wait()
        if a == 0:
            print("a")
            break

def test2():
    while True:
        # 在每个循环开始前检查事件状态
        pause_event.wait()
        if b == 0:
            print("b")
            break

# 创建并启动两个子线程
thread1 = threading.Thread(target=test1)
thread2 = threading.Thread(target=test2)
thread1.start()
thread2.start()

# 主线程执行的代码
def pause_threads():
    # 设置事件来暂停子线程
    pause_event.set()
    # 执行其他逻辑...

# 在某个地方调用暂停函数来暂停所有子线程
pause_threads()

# 在某个地方恢复子线程的执行
pause_event.clear()  # 清除事件,让子线程继续执行

只需要使用一个事件对象来控制多个子线程的暂停和恢复。

然后回答问题3,要在暂停后重新启动子线程,只需要清除事件即可。可以通过调用pause_event.clear()来清除事件,让子线程继续执行。

最后回答问题4,还有其他一些替代方案可以实现在多线程中暂停和继续执行的功能。除了使用事件对象外,还可以使用其他同步原语,如锁(Lock)或条件变量(Condition)来实现。

使用锁可以实现线程的互斥访问,可以在主线程中获取锁来暂停子线程的执行,再释放锁来恢复子线程的执行。

使用条件变量可以实现线程的等待和通知机制,可以通过条件变量来暂停子线程的执行,再通过发送信号来通知子线程继续执行。

以上就是如何在Python的多线程中暂停子线程并继续执行的解决方案。如果没有解决您的问题,请告诉我。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^