Увы, это нигде не так просто, как изменить дисциплину обслуживания старого доброго Queue.Queue
: последний на самом деле предназначен для создания подклассов в соответствии с шаблоном метода-шаблона и переопределяет только методы хука _put
и / или _get
может легко позволить изменить дисциплину организации очередей (в 2.6 предлагается явный LIFO и приоритетные реализации, но их было легко сделать даже в более ранних версиях Python).
Что касается многопроцессорной обработки, то в общем случае (несколько читателей, несколько писателей) я не вижу решения для реализации приоритетных очередей, кроме как отказаться от распределенной природы очереди; назначить один специальный вспомогательный процесс, который ничего не делает, кроме обработки очередей, посылать (по существу) RPC в него, чтобы создать очередь с указанной дисциплиной, do помещает и получает к ней, получает информацию об этом и т. д. Таким образом, можно было бы получить обычные проблемы с гарантией того, что каждый процесс знает о расположении вспомогательного процесса (скажем, хост и порт) и т. Д. (Проще, если процесс всегда вызывается при запуске основным процессором). Довольно большая проблема, особенно если кто-то хочет сделать это с хорошей производительностью, защитит от сбоев aux proc (требующих репликации данных на подчиненные процессы, распределенных «главных выборов» среди подчиненных, если мастер сбоит и т. Д.) И так далее. Делать это с нуля звучит как работа доктора философии. Можно было бы начать с работы Джонсона или использовать какой-то очень общий подход, например ActiveMQ .
Некоторые особые случаи (например, один читатель, один писатель) могут быть проще и оказываются быстрее для их ограниченной области применения; но тогда для этой ограниченной области должна быть разработана очень специфически ограниченная спецификация, и результаты не будут представлять собой (универсальную) «многопроцессорную очередь», а применимы только к данному ограниченному набору требований.