【问题标题】:Interrupting Infinite Loop in Threading中断线程中的无限循环
【发布时间】:2020-12-31 12:10:57
【问题描述】:

我正在学习使用 Python 3.8.2 进行线程化。我有一个带有无限循环的函数,然后还有两个使用 threading.Timer 类的函数。

def x:
    while True:
        dosomething()

def f1():
    dosomething2()
    threading.Timer(60,f1).start()

def f2():
    dosomething3()
    threading.Timer(100,f2).start()

然后我启动三个线程:

t1 = threading.Thread(target=x)
t2 = threading.Thread(target=f1)
t3 = threading.Thread(target=f2)

当需要执行 f1 或 f2 时,我不希望 x() 同时执行(它们可能使用相同的资源)并暂停,让 f2 或 f1 完成,然后然后在 x() 中恢复无限循环。我该怎么做?

我看过 join() 但在我看来它会永远等待 f1() 和 f2() 因为它每次都会创建一个新线程并且不会终止。

这是一张解释流程的照片:

【问题讨论】:

    标签: python multithreading


    【解决方案1】:

    这是一个可能的解决方案,我在代码中添加了函数 dosomething() dosomething2() dosomething3() 以获得一个工作示例。我还将线程上的计时器分别更改为 6 秒和 10 秒,而不是 60 秒和 100 秒,这样我们就不必等待那么长时间才能看到它们的功能。

    dosomething()

    • 如果没有其他函数在运行,则每秒打印一次'dosomething is running'

    dosomething2()

    • 设置dosomething2.status = 'run'

    • 打印'dosomething2 is running 1st second'

    • 等待一秒钟

    • 打印'dosomething2 is running 2nd second'

    • 设置dosomething2.status = 'sleep'

    dosomething3()

    • 设置dosomething3.status = 'run'

    • 打印'dosomething3 is running 1st second'

    • 等待一秒钟

    • 打印'dosomething3 is running 2nd second'

    • 等待一秒钟

    • 打印'dosomething3 is running 3rd second'

    • 设置dosomething3.status = 'sleep'

    dosomething2()dosomething3() 中的第一行和最后一行将是触发器,让我们的x() 函数知道只有当这两个函数都处于'sleep' 的状态时才会运行。

    您可以使用global 变量而不是dosomething2.statusdosomething3.status 但有些人recommend not using them.

    代码

    import time
    import threading
    
    
    def dosomething():
        print('dosomething is running')
        time.sleep(1)
    
    def dosomething2():
        dosomething2.status = 'run'
        print('\tdosomething2 is running 1st second')
        time.sleep(1)
        print('\tdosomething2 is running 2nd second')
        dosomething2.status = 'sleep'
    
    def dosomething3():
        dosomething3.status = 'run'
        print('\tdosomething3 is running 1st second')
        time.sleep(1)
        print('\tdosomething3 is running 2nd second')
        time.sleep(1)
        print('\tdosomething3 is running 3rd second')
        dosomething3.status = 'sleep'
    
    dosomething2.status = ''
    dosomething3.status = ''
    
    def x():
        while True:
            if dosomething2.status == 'sleep' and dosomething3.status == 'sleep':
                dosomething()
    
    def f1():
        dosomething2()
        threading.Timer(6,f1).start()
    
    def f2():
        dosomething3()
        threading.Timer(10,f2).start()
    
    
    t1 = threading.Thread(target=x)
    t2 = threading.Thread(target=f1)
    t3 = threading.Thread(target=f2)
    
    t1.start()
    t2.start()
    t3.start()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多