我在Python中有一个列表,我在几个不同的进程(listproxy)之间共享,我需要能够将此列表限制为一定数量的元素。该单元在Raspberry Pi上运行,所有数据都存储在内存中,因此我需要该列表能够随时间限制。该列表存储日志消息只是为了填充您的上下文,我们愿意删除最早的项目,因为它填满,所以它本质上是一个滚动列表。我知道我可以使用一个数组然后从底部弹出然后我正在运行O(n-1)操作来将所有元素移动到该数组中的1个元素上。我可以使用队列,堆栈或数组,只要它们是多处理友好的。我知道我可以创建一个链接列表,但是我想联系以防其他人有想法,因为链接列表不支持多处理开箱即用,所以我必须创建一个。
提前致谢!
答案 0 :(得分:2)
基于已有的注释,我们可以将唯一的线程安全deque转换为多处理安全的deque对象。它涉及来自multiprocessing.managers的SyncManager。这将创建一个“管理器进程”,用于协调对所有其他进程的deque对象的访问,并且可以共享生成的deque对象:
from collection import deque
from multiprocessing.managers import SyncManager
class DequeueManager(SyncManager):
'''
An dequeue manager object to allow for multi process access to an
dequeue object
'''
pass
# Register a shared dequeue
DequeueManager.register("deque", deque)
# code before all the other processes are forked
deque_manager = DequeueManager()
deque_manager.start()
# get shareable multiprocess deque object
deque = deque_manager.deque()
# fork processes and share queue object
# more info about SyncManager: https://docs.python.org/2/library/multiprocessing.html#multiprocessing.managers.SyncManager
对于未来的读者:如果您要使用长期生产应用程序,您可能应该花时间为此用例设置rabbitmq或simmilar排队系统。