还差几 2023-09-06 00:26 采纳率: 25%
浏览 6

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

情景

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

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

尝试

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

需求

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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-06 12:12
    关注

    【以下回答由 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的多线程中暂停子线程并继续执行的解决方案。如果没有解决您的问题,请告诉我。


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

报告相同问题?

问题事件

  • 创建了问题 9月6日

悬赏问题

  • ¥15 CARSIM前车变道设置
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败