簡體   English   中英

在第二次執行時停止 function 的第一次執行(Python)

[英]Halting first execution of function on second execution (Python)

我有一個 function 在頁面加載時調用,但也可以通過按鈕調用。 當頁面加載時,調用 function - 它只是等待 15 秒然后終止。 另一方面,如果用戶在 15 秒結束前按下按鈕,則再次調用 function 並立即終止。 按下此按鈕有什么方法可以停止 function 的第一次調用?

#the first execution is called with the default value for the "chosen" argument.
#the second one (on button press) is always called with a non-zero value for "chosen"

def background_calculation(self, chosen=0):
    if chosen == 0:
        time.sleep(15)
        pos = np.random.randint(1, 54)
        return pos
    else:
        pos = chosen
        #I would like to stop the first function call from continuing to execute here.
        return pos

上下文:當線程打開時調用background_calculation 用戶有 15 秒的時間進行選擇,如果他們不這樣做,線程應該以pos的隨機值關閉。 另一方面,如果用戶在 15 秒結束之前做出選擇,則調用 function 並立即結束線程並返回用戶選擇的值。 目前function執行兩次,返回兩個值,用戶選擇的一個和隨機生成的一個。

我嘗試了什么:我嘗試使用指向“選擇”的最新值的指標/虛擬變量。 在 15 秒結束時,function 將檢查虛擬變量是否仍指向 0(表明所選擇的從未更改過),如果不是,則會停止。

您可能想要維護一個全局 state:

button_clicked = False

def background_calculation(self, chosen=0):
    if chosen == 0:
        for i in range(15):
            time.sleep(1)
            if button_clicked: # user clicks the button
                break
        else:
            pos = np.random.randint(1, 54)
            return pos
    
    else: # chosen = 1
        global button_clicked
        button_clicked = True
        
        pos = np.random.randint(1, 54)
        return pos

請注意,此實現只是向您展示我們如何檢測按鈕單擊。

警告:直接調用這不是線程安全的。

如果您一次只需要運行一個實例,則可以使用鎖:

from threading import Lock

with Lock():
    background_calculation(self, chosen=0) # or 1

如果您需要同時進行多項計算(來自多個用戶單擊按鈕),您需要在 function 內加鎖,以確保 state 設置正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM