Python多处理数据交换

2024-05-18 08:20:05 发布

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

我试图在同一进程内的两个线程之间传递数据,主线程在一个单独的类中生成一个新线程。我试图使用multiprocessing.Queue对象传递一个字符串。在

我不明白为什么第二个线程看不到队列中的数据。在

在主类.py在

if(__name__ == '__main__'):
    # Create the threads
    itemInterestThread = NewItemInterestHelper("Item Interest Thread")

    # Start the Item Interest Thread
    itemInterestThread.run()

    time.sleep(1)
    print "Adding item\n"
    itemInterestThread.addToQueue("Neat Thing")
    time.sleep(1)
    print "Adding item\n"
    itemInterestThread.addToQueue("Neat Thing2")

    print "Sleeping for 5 seconds"
    time.sleep(5)

NewItemInterestHelper.py在

^{pr2}$

Tags: thepytimesleepitem线程neatthread
1条回答
网友
1楼 · 发布于 2024-05-18 08:20:05

首先,你的问题混淆了线程和多处理。他们不是一回事。如果你把你的问题更新得更清楚一点也许会更好。线程化是在同一个进程中完成的(至少在概念上是这样),因此将共享所有全局变量和状态。当进行多处理时,这些进程将彼此独立,因此共享全局变量和状态。相反,每个进程将实例化自己的进程。在

因此,类变量(实际上是全局变量)将不会在主进程和辅助进程之间共享。不同的进程将有自己的队列和锁,从头创建。在

但是,如果锁和队列属于对象而不是类,则在生成辅助进程时将复制它们。这样他们就可以分享足够的内部信息来做你想让他们做的事情。因此,如果您更改NewItemInterestHelper使锁和队列成为动态对象的一部分,它应该可以工作:

class NewItemInterestHelper:
    # Removing all class variables

    def __init__(self, name):
        self.__itemsQueue = multiprocessing.Queue()
        self.__itemMutex = multiprocessing.Lock()
        # removing self.__pool since it is just overwritten
        # by the run method

        self.name = name

    # Rest of class follows...

现在,因为辅助进程中的队列和锁是从主进程中的队列和锁的副本创建的。这样,它们将共享足够多的内部构件,从而分别被视为相同的队列和锁。在

另一方面,我假设这是一个简化的例子,因为在本文中,根本不需要互斥锁。不需要保护对队列的写入不受来自队列的读取,因为这是由底层系统自动处理的。在

相关问题 更多 >