【问题标题】:Python infinity threading loop without duplicate or interrupt thread taskPython无限线程循环,没有重复或中断线程任务
【发布时间】:2022-01-23 22:21:46
【问题描述】:

我编写这段代码是为了创建一个无限线程循环,没有重复或中断线程任务。

import threading
import time
thread = None

def loopMyTask():
    global thread
    if thread is not None and thread.isAlive():
        thread.cancel()
        thread.join()
            
    thread = threading.Timer(6.0, loopMyTask)
    thread.daemon = True
    thread.start()
    myTask()

def myTask():
    # simulate a task
    for i in range(14) :
        print(str(i))
        time.sleep(1)

while True:
    loopMyTask()

显然它正在工作,但它返回一个警报

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    我不确定你想做什么,但只有主线程在这里做一些工作:

    1. 你打电话给loopMyTask()
    2. 它设置了一个定时器,在 6 秒内启动一个新线程调用自己
    3. 它调用myTask,它会打印 1、2、3、4、5...
    4. 计时器在新线程中触发对loopmytask() 的调用。
    5. 新线程发现全局变量thread 已设置(并且线程处于活动状态),因此它调用cancel。这没有任何作用:它是为了取消计时器,但它已经完成了。确实,这部分代码在运行是因为时间到了
    6. 新线程调用thread.join(),这将导致死锁,因为它会等待自己完成。幸运的是,threading 模块可以防止这种死锁并引发RuntimeError。线程死了。
    7. 主线程继续执行myTask,打印6、7、8...
    8. 一旦完成,循环将再次进入步骤 1。thread.join() 调用这次不会触发错误,但一切都会再次重复。

    所以,如果你只是在循环中调用myTask(),你会得到相同的结果(除了错误)

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2017-06-13
      相关资源
      最近更新 更多