Python 什么样的数据结构最适合于顶部/底部弹出?
我在Python中有一个列表,在几个不同的进程(listproxy)之间共享,我需要能够将这个列表限制为一定数量的元素。该装置运行在Raspberry Pi上,所有数据都存储在内存中,因此我需要能够随时间限制列表。该列表存储日志消息只是为了让您了解上下文,我们愿意在它填满时删除最早的项,因此本质上它是一个滚动列表。我知道我可以使用一个数组,然后从底部弹出,但是我正在运行一个O(n-1)操作,将所有元素移动到该数组中的一个元素上。我可以为此使用队列、堆栈或数组,只要它们是多处理友好的。我知道我可以创建一个链表,但我想联系一下,以防其他人有想法,因为链表不支持开箱即用的多处理,所以我必须创建一个Python 什么样的数据结构最适合于顶部/底部弹出?,python,data-structures,python-multiprocessing,Python,Data Structures,Python Multiprocessing,我在Python中有一个列表,在几个不同的进程(listproxy)之间共享,我需要能够将这个列表限制为一定数量的元素。该装置运行在Raspberry Pi上,所有数据都存储在内存中,因此我需要能够随时间限制列表。该列表存储日志消息只是为了让您了解上下文,我们愿意在它填满时删除最早的项,因此本质上它是一个滚动列表。我知道我可以使用一个数组,然后从底部弹出,但是我正在运行一个O(n-1)操作,将所有元素移动到该数组中的一个元素上。我可以为此使用队列、堆栈或数组,只要它们是多处理友好的。我知道我可以
提前谢谢 根据已经存在的注释,我们可以将唯一的线程安全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排队系统。基于已有的注释,我们可以将唯一的线程安全的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或Similar排队系统。您可能需要一个deque,一个双端队列,以允许从两端推送/弹出。我想,通常使用双链接列表来实现。可能是一个
collections.deque
:是的,您的右@ap。谢天谢地,Python已经预见到了这种情况。我看到了deque,但尽管它是线程安全的,但它不支持多处理。我也许可以使用它来同时使用两种不同的数据结构。我实际上只有一个进程需要直接与日志消息交互,因此我可以将传入消息存储到队列中,并让一个进程将这些消息推送到deque。您可能需要deque,一个双端队列,以允许从两端进行推/弹出。我想,通常使用双链接列表来实现。可能是一个collections.deque
:是的,您的右@ap。谢天谢地,Python已经预见到了这种情况。我看到了deque,但尽管它是线程安全的,但它不支持多处理。我也许可以使用它来同时使用两种不同的数据结构。我实际上只有一个进程需要直接与日志消息交互,因此我可以将传入的消息存储到队列中,并让一个进程将这些消息推送到deque。现在尝试一下。非常感谢!很高兴有帮助。现在就试试这个。非常感谢!很高兴这有帮助。