簡體   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