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