繁体   English   中英

中断线程中的无限循环

[英]Interrupting Infinite Loop in Threading

我正在使用 Python 3.8.2 学习线程。 我有一个带有无限循环的 function,然后是另外两个使用 threading.Timer class 的函数。

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() 因为它每次都会创建一个新线程并且不会终止。

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

在此处输入图像描述

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

dosomething()

  • 如果没有其他 function 正在运行,则每秒打印一次'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( dosomething2()和 dosomething3 dosomething3()中的第一行和最后一行将是触发器,让我们的x() function 知道仅当两个函数都在'sleep'的 state 中时才运行。

您可以使用global变量代替dosomething2.statusdosomething3.status但有些人建议不要使用它们。

代码

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM