如何在线程之间共享对象?

时间:2019-06-05 13:42:18

标签: python python-3.x multithreading list shared-memory

我有一种情况,一个类的对象被传递(作为初始化的一部分)到另一个类。

一般来说,其中一个类将更新对象,而另一类将输出对象(不修改对象)。这将在单独的线程中发生。

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()

我认为dataself.data(在两个类中)最终都指向相同的数据,但事实并非如此:输出是一组[],表明Producer中的修改未反映在Consumer中。

我可能最终会重新设计代码以避免这些技巧,但是我真的很想了解data的副本出现的位置(这将解释为什么所有内容都不指向相同的内存)

1 个答案:

答案 0 :(得分:2)

首先-数据引用相同,您正在正确初始化它们。您可以通过运行State(这是pythons引用相等性)进行检查。

print(consumer.data is producer.data)不会产生单独的线程。它在当前线程的上下文中运行线程函数,因此您陷入了run()打印循环中,实际上从未调用过consumer.print

您应该改为致电producer.update

.start()