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

2024-06-17 12:01:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个例子,其中一个类的对象被传递(作为初始化的一部分)到另一个类。你知道吗

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

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的副本发生在哪里(这将解释为什么所有内容都不指向相同的内存)


Tags: producer对象importselfdatatimeconsumerinit
1条回答
网友
1楼 · 发布于 2024-06-17 12:01:14

首先-对数据的引用是相同的,您正确地初始化了它们。您可以通过运行print(consumer.data is producer.data)(这是pythons引用等式)来检查这一点。你知道吗

run()不会产生单独的线程。它在当前线程的上下文中运行thread函数,因此您被困在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()

相关问题 更多 >