繁体   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