如何跨线程和模块通过引用传递布尔值

问题描述 投票:0回答:2

我有一个布尔值,我想将其传递给正在执行不同模块的方法的不同线程。该布尔值充当取消标记,因此如果设置,线程应该退出。它似乎是按值传递的,因为如果我将它设置在另一个线程中,它在其他线程中不会改变。谢谢。

import module2
from threading import Thread

cancellationToken = False

def main:
    thread2 = Thread(target = module2.method2, args (on_input, cancellationToken, ))
    thread2.start()
    ...
    thread2.join()

def on_input(command):
    global cancellationToken
    ...
    if(...):
        cancellationToken = True
    ...

module2 中的 method2 只是一个简单的无限 while 循环,用于检查取消标记并响应用户输入。

def method2(on_input, cancellationToken):
    while(True):
        if(cancellationToken):
            return
        ...
        on_input(...)
python python-multithreading
2个回答
7
投票

当你这样做时:

thread2 = Thread(target = module2.method2, args (on_input, cancellationToken, ))

您实际上是将第二个参数的值

False
传递给了线程方法。

但是当你之后这样做时:

cancellationToken = True

您将替换由

cancellationToken
表示的引用,而不是最初传递给
thread2
的值。

为了实现您想要做的事情,您需要为取消状态创建一个可变对象包装器:

class CancellationToken:
   def __init__(self):
       self.is_cancelled = False

   def cancel(self):
       self.is_cancelled = True

cancellationToken = CancellationToken()

thread2 = Thread(target = module2.method2, args (on_input, cancellationToken, ))

# then later on
cancellationToken.cancel()

你的线程代码变成:

def method2(on_input, cancellationToken):
    while(True):
        if(cancellationToken.is_cancelled):
            return
        ...
        on_input(...)

0
投票

我建议使用我为此编写的 cantok 库。

安装:

pip install cantok

并使用:

from random import randint
from cantok import ConditionToken, CounterToken, TimeoutToken


token = ConditionToken(lambda: randint(1, 100_000) == 1984) + CounterToken(400_000, direct=False) + TimeoutToken(1)
counter = 0

while token:
  counter += 1

print(counter)
© www.soinside.com 2019 - 2024. All rights reserved.