运行 在 python 中进行多处理时共享内存全局列表

Shared memory global list while running multiprocessing in python

我目前正在为我的流媒体编写一个聊天机器人。因为它需要同时做多件事,所以我使用了多处理模块,这样它仍然可以同时响应命令和执行功能。我现在的问题是,我有一个进程专用于一些网络抓取,另一个进程用于查看聊天并在键入命令时做出响应。我的想法是,如果我将来自一个进程的信息附加到全局列表,然后在聊天中输入命令时,另一个进程可以使用附加列表中的信息。好吧,这没有用,我了解到这是因为这两个进程没有共享内存,尽管它们都可以访问同一个列表,但它们都是列表的副本,所以即使一个附加,在另一个process' 的情况下,它仍然是空的。我在 stack overflow 上遇到了一些关于此的问题,但这些示例非常具体,而且由于我对编码还很陌生,所以我很难弄清楚如何将它应用到我自己的代码中。出于这个确切的原因,我简化了问题,以便它可以帮助处于类似情况的其他人,方法是让我的示例足够广泛和简单,让任何人在阅读解决方案后都能理解它。因此,这不是我实际用于我的聊天机器人的代码,而是模拟问题的代码。

import multiprocessing as mp
import time

globalList = []

def readList():
    while True:
        time.sleep(2)
        if globalList:
            print(globalList)
        else:
            print("List is Empty")
            print(globalList)
def writeList():
    while True:
        time.sleep(3)
        globalList.append("Item")
        print(globalList)

if __name__ == '__main__':
    p1 = mp.Process(target=readList)
    p2 = mp.Process(target=writeList)
    p1.start()
    p2.start()

当运行这段代码你可以看到writeList函数会不停地向列表中添加另一个项目,但是readList函数会一直显示一个空列表。

希望有高手能帮我解决这个问题

你无法通过正常方式获得它。进程有自己的内存space。另一方面,线程具有相同的内存 space 并且在一个进程中 运行。

更多请参考本回答Multiprocessing vs Threading Python

Python processes cannot straightforwardly access global mutable objects created by other processes. For this, you can use, for example, a multiprocessing.Manager及其代理对象中。您改编的示例:

import multiprocessing as mp
import time


def readList(shared_list):
    while True:
        time.sleep(2)
        if shared_list:
            print(shared_list)
        else:
            print("List is Empty")
            print(shared_list)


def writeList(shared_list):
    while True:
        time.sleep(3)
        shared_list.append("Item")
        print(shared_list)


if __name__ == '__main__':
    manager = mp.Manager()
    shared_list = manager.list()
    p1 = mp.Process(target=readList, args=(shared_list,))
    p2 = mp.Process(target=writeList, args=(shared_list,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()