运行 在 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()
我目前正在为我的流媒体编写一个聊天机器人。因为它需要同时做多件事,所以我使用了多处理模块,这样它仍然可以同时响应命令和执行功能。我现在的问题是,我有一个进程专用于一些网络抓取,另一个进程用于查看聊天并在键入命令时做出响应。我的想法是,如果我将来自一个进程的信息附加到全局列表,然后在聊天中输入命令时,另一个进程可以使用附加列表中的信息。好吧,这没有用,我了解到这是因为这两个进程没有共享内存,尽管它们都可以访问同一个列表,但它们都是列表的副本,所以即使一个附加,在另一个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()