如何在线程之间共享一个对象?
How to share an object between threads?
我有一个案例,其中一个 class 的对象被传递(作为初始化的一部分)到另一个 class。
一般来说,class其中一个将更新对象,而另一个将输出它(不修改对象)。这将在不同的线程中发生。
import threading
import time
import random
class Consumer:
def __init__(self):
self.data = []
def print(self):
while True:
print(self.data)
time.sleep(1)
class Producer:
def __init__(self, data):
self.data = data
def update(self):
while True:
self.data.append(random.random())
consumer = Consumer()
producer = Producer(consumer.data)
threading.Thread(target=consumer.print).run()
threading.Thread(target=producer.update).run()
我认为 data
和 self.data
(在两个 classes 中)最终会指向相同的数据,但事实并非如此:输出是一组 []
这表明 Producer
中的修改未反映在 Consumer
.
中
我可能最终会重新设计代码以避免此类技巧,但我真的很想了解 data
的副本发生在哪里(这可以解释为什么所有内容都不指向同一内存)
首先 - 对数据的引用是相同的,您正确地初始化了它们。您可以通过 运行 print(consumer.data is producer.data)
来检查(这是 python 引用相等性)。
run()
不会生成单独的线程。它在当前线程的上下文中运行线程函数,因此您陷入了 consumer.print
打印循环,而 producer.update
从未真正被调用
您应该改为调用 .start()
:
import threading
import time
import random
class Consumer:
def __init__(self):
self.data = []
def print(self):
while True:
print(self.data)
time.sleep(1)
class Producer:
def __init__(self, data):
self.data = data
def update(self):
while True:
self.data.append(random.random())
time.sleep(1)
consumer = Consumer()
producer = Producer(consumer.data)
threading.Thread(target=consumer.print).start()
threading.Thread(target=producer.update).start()
我有一个案例,其中一个 class 的对象被传递(作为初始化的一部分)到另一个 class。
一般来说,class其中一个将更新对象,而另一个将输出它(不修改对象)。这将在不同的线程中发生。
import threading
import time
import random
class Consumer:
def __init__(self):
self.data = []
def print(self):
while True:
print(self.data)
time.sleep(1)
class Producer:
def __init__(self, data):
self.data = data
def update(self):
while True:
self.data.append(random.random())
consumer = Consumer()
producer = Producer(consumer.data)
threading.Thread(target=consumer.print).run()
threading.Thread(target=producer.update).run()
我认为 data
和 self.data
(在两个 classes 中)最终会指向相同的数据,但事实并非如此:输出是一组 []
这表明 Producer
中的修改未反映在 Consumer
.
我可能最终会重新设计代码以避免此类技巧,但我真的很想了解 data
的副本发生在哪里(这可以解释为什么所有内容都不指向同一内存)
首先 - 对数据的引用是相同的,您正确地初始化了它们。您可以通过 运行 print(consumer.data is producer.data)
来检查(这是 python 引用相等性)。
run()
不会生成单独的线程。它在当前线程的上下文中运行线程函数,因此您陷入了 consumer.print
打印循环,而 producer.update
从未真正被调用
您应该改为调用 .start()
:
import threading
import time
import random
class Consumer:
def __init__(self):
self.data = []
def print(self):
while True:
print(self.data)
time.sleep(1)
class Producer:
def __init__(self, data):
self.data = data
def update(self):
while True:
self.data.append(random.random())
time.sleep(1)
consumer = Consumer()
producer = Producer(consumer.data)
threading.Thread(target=consumer.print).start()
threading.Thread(target=producer.update).start()