Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么样的数据结构最适合于顶部/底部弹出?_Python_Data Structures_Python Multiprocessing - Fatal编程技术网

Python 什么样的数据结构最适合于顶部/底部弹出?

Python 什么样的数据结构最适合于顶部/底部弹出?,python,data-structures,python-multiprocessing,Python,Data Structures,Python Multiprocessing,我在Python中有一个列表,在几个不同的进程(listproxy)之间共享,我需要能够将这个列表限制为一定数量的元素。该装置运行在Raspberry Pi上,所有数据都存储在内存中,因此我需要能够随时间限制列表。该列表存储日志消息只是为了让您了解上下文,我们愿意在它填满时删除最早的项,因此本质上它是一个滚动列表。我知道我可以使用一个数组,然后从底部弹出,但是我正在运行一个O(n-1)操作,将所有元素移动到该数组中的一个元素上。我可以为此使用队列、堆栈或数组,只要它们是多处理友好的。我知道我可以

我在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。现在尝试一下。非常感谢!很高兴有帮助。现在就试试这个。非常感谢!很高兴这有帮助。