簡體   English   中英

線程 python 時,在 function 中發送變量不起作用

[英]Sending variable in function doesn't work when threading python

目前正在嘗試做一個空閑的 animation ,它在空閑 = True 時不斷更新字符,並試圖將其主要保留在 function 中以供以后使用。

但是,當我在 function 之外更新 idle = False 時,它並沒有停止 animation。

我遇到了線程,這似乎解決了一些問題。

import time
import threading
b = True
def test_func():
    global b
    while b:
        print '1'

threading.Thread(target=test_func).start()
b = False

這行得通,但 function 更容易接受類似的東西

def test_func(b):

並使用它來代替許多全局變量。 尤其是當我將它用於多件事情時,讓它只接受將檢查哪一個而不是更多行會很有幫助。 當試圖做

import time
import threading
b = True
def test_func(b):
    while b:
        print '1'

threading.Thread(target=test_func(b)).start()
b = False

(b) 似乎使線程無法正常工作,因為它不斷進行而不是在 b = False 時停止

(這是我的小測試代碼,其中 b 代表 boolean 如果它繼續更新並且打印'1'部分代替字符更新。)(我也嘗試使用 lambda 因為這是我記得在其他情況下工作的我需要傳遞一個這樣的變量,但我對其進行了測試,但它不起作用)

當您編寫threading.Thread(target=test_func(b)).start() function 作為收集 arguments 到Thread的一部分時,在線程啟動之前; 此外,function 獲取變量的副本,而不是變量本身。

為了使這樣的事情起作用,您需要解決兩半:

  • 讓它接受一個參數,但仍然是一個 function 將被調用

    這可以通過幾種方式完成。 可能最干凈的方法是將test_func作為 object 的一部分,以便將b傳遞給構造函數,然后將方法作為線程:

     threading.Thread(target=Worker(b).test_func).start()

    這通常是最好的,因為它為您提供了所有與線程相關的數據和函數的位置(它們都存在於同一個對象中)。

    如果這太多了,如果你真的只有一個 function 需要像這樣調用,你可以使用functools.partial或閉包:

     threading.Thread(target=partial(test_func, b)).start()
  • 使用可以就地修改的可變值

    當您將 boolean 傳遞給 function 時,function 有效地獲得了副本。 您需要使用一些可以就地更改的可變值(對象、列表等)。

    如果您使用 object 作為第一項,那可能是最簡單的:

     w = Worker() threading.Thread(target=w.test_func).start() wb = False

    否則,您可以將b設為 dict 或 list 或類似內容,然后更改其中的特定條目:

     threading.Thread(target=partial(test_func, b)).start() b['active'] = False

暫無
暫無

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

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