[英]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.