如何导入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)
谢谢。
【问题讨论】:
我可能会使用你传递给f01
的threading.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循环并使用多线程返回其更新值?的主要内容,如果未能解决你的问题,请参考以下文章