[英]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()
'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.status
和dosomething3.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.