您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

从multiprocessing.Queue获得近LIFO行为的干净方法?(或什至只是*不是*近FIFO)

从multiprocessing.Queue获得近LIFO行为的干净方法?(或什至只是*不是*近FIFO)

我查看了Lib/multiprocessing/queues.py安装在Python安装中的Queue类(Python 2.7,但与我简短检查过的Python 3.2的版本没有明显不同)。我了解它的工作原理:

队列对象维护两组对象。一组是由所有进程共享的多进程安全基元。其他每个进程分别创建和使用。

跨过程对象是在__init__方法中设置的:

每个进程对象在_after_fork_start_thread方法中设置:

get队列中的A非常简单。您获得了读取锁,减少了信号量,并从Pipe的读取端获取一个对象。

Aput更复杂。它使用多个线程。调用获取put条件的锁,然后将其对象添加到缓冲区中并在解锁条件之前发出信号。如果信号量尚未运行,它还会增加信号量并启动它。

编写器线程在该_Feed方法中永远循环(直到取消)。如果缓冲区为空,则等待notempty条件。然后,它从缓冲区中获取一个项目,获取写锁(如果存在)并将该项目写入Pipe。

因此,鉴于所有这些,您可以对其进行修改获取LIFO队列吗?这似乎并不容易。管道本质上是FIFO对象,尽管Queue不能整体保证FIFO的行为(由于来自多个进程的写入的异步特性),但它总是主要是FIFO。

如果只有一个使用者,则可以get从队列中将对象添加到自己的本地进程堆栈中。尽管使用共享内存,但有一定限制的堆栈不会太难,因此很难做到多用户堆栈。您需要一个锁,一对条件(用于在完全状态和空状态下进行阻塞/信号发送)??,一个共享的整数值(用于保存的值的数量)和一个适当类型的共享数组(用于值本身)。

其他 2022/1/1 18:35:09 有474人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶