如何导入while循环并使用多线程返回其更新值?

Posted

技术标签:

【中文标题】如何导入while循环并使用多线程返回其更新值?【英文标题】:How to import a while loop and return its updated value with multi-threading? 【发布时间】:2022-01-20 18:46:58 【问题描述】:

如何导入 while 循环并使用多线程返回其更新值? 想法如下,但我不知道如何使它工作。

# P01.py
def f01(name="a"):
    count =1
    while True:
       count+=1
       return count, name

# P02.py
import P01, threading
# (count1, name1) = f01(name="a")
# (count2, name2) = f01(name="b")

t1 = threading.Thread(target=f01, args=("a",))
t2 = threading.Thread(target=f01, args=("b",))
t1.start()
t2.start()

print(t1)
print(t2)

谢谢。

【问题讨论】:

我可能会使用你传递给f01threading.queue,然后你可以从线程内将结果推送到队列中,然后在主线程的另一端弹出它们。对于这里的琐碎案例来说,这会过于复杂,这是从线程“屈服”的一个很好的“秘诀”。 【参考方案1】:

你可以继承Thread 并在那里保持状态。未经测试的例子:

class MyThing(Thread):
    def __init__(self, name):
        self.name = name
        self.count = 0
        super().__init__(target=self.worker)
    def worker(self):
        while True:
            self.count += 1

然后是这样的:

t1 = MyThing("a")
t1.start()

然后你想看的时候就print(t1.count)

请注意,如果MyThing 变得更加复杂,您将需要使用threading.Lock 作为互斥体,并提供一个getter 方法(或属性)来访问计数,该计数在查看.count 时持有锁。工作人员在更新.count 时同样会获得锁。通过这种方式,您可以确保内部状态在您查看时不会发生变化。

【讨论】:

如何使用“super().__init__(target=self.worker)”?假设有两个函数,是不是需要写1.super().__init__(target=self.worker_1)和2.super().__init__(target=self.worker_2)? 拥有两个worker函数是什么意思?请记住,我们正在继承一个线程,其target 是在线程中运行的单个函数。你来这里的目的是什么? 2个并行线程?一个线程串联运行每个函数?从Thread 中退出,只讨论类,__init__ 的目的是初始化新实例。它通常只调用一次,调用super().__init__ 具有相同的约束。 Python 不会禁止它,但通常的结果是第二次调用会简单地覆盖第一次调用设置的值。

以上是关于如何导入while循环并使用多线程返回其更新值?的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地同时多线程和更新变量?

在while循环中将布尔值更改为true? C++

Callable+ThreadPoolExecutor实现多线程并发并获得返回值(转)

如何定期使用多线程获取服务器状态

如何从 while 循环中返回 2 个布尔值?爪哇

如何多线程(多进程)加速while循环(语言-python)?