Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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
Python3.6是否有erlang风格的消息队列?_Python_Message Queue_Priority Queue_Message Passing - Fatal编程技术网

Python3.6是否有erlang风格的消息队列?

Python3.6是否有erlang风格的消息队列?,python,message-queue,priority-queue,message-passing,Python,Message Queue,Priority Queue,Message Passing,我正在寻找Python3.6(这个确切版本)的消息队列实现,它可以用来在多进程之间进行通信。进程es,具体来说,它应该是一个多生产者、单消费者、fifo,优先接收应用程序特定类型的消息(例如,如果有系统消息(用erlang术语)在队列的中间,队列中的一个正常消息,下一个接收应该返回系统消息而不是正常消息) 但我怀疑是否会有这样一个库,所以问题变成了,是否有任何stdlib或第三方库可以给我一块共享内存或更好的列表,这样我就可以读写一个缓冲区,但内存/列表并用类似mp.Lock的东西来保护顺序 m

我正在寻找Python3.6(这个确切版本)的消息队列实现,它可以用来在
多进程之间进行通信。进程
es,具体来说,它应该是一个多生产者、单消费者、fifo,优先接收应用程序特定类型的消息(例如,如果有系统消息(用erlang术语)在队列的中间,队列中的一个正常消息,下一个接收应该返回系统消息而不是正常消息)

但我怀疑是否会有这样一个库,所以问题变成了,是否有任何stdlib或第三方库可以给我一块共享内存或更好的列表,这样我就可以读写一个缓冲区,但内存/列表并用类似
mp.Lock
的东西来保护顺序


multiprocessing.Manager
使用tcp,并启动一个新进程

我对Erlang不太熟悉,但是,根据您描述的需求,我认为您可以采用使用
multiprocessing.Queue
的方法,并在阅读消息之前对其进行排序

其思想是为每个进程提供一个
多处理.Queue
(FIFO消息队列)。当进程A向进程B发送消息时,进程A将其消息连同消息的优先级一起放入进程B的消息队列中。当进程读取其消息时,它将消息从FIFO队列传输到列表中,然后在处理消息之前对列表进行排序。消息首先按优先级排序,然后按到达消息队列的时间排序

下面是一个在Windows上用Python 3.6测试过的示例

来自多处理导入进程,队列
导入队列
导入时间
def句柄消息(进程id、消息队列):
#跟踪邮件编号,以确保邮件具有相同的优先级
#以先进先出的方式阅读。
消息编号=0
消息=[]
尽管如此:
尝试:
优先级,contents=message\u queue.get\u nowait()
messages.append((优先级、消息号、内容))
消息号+=1
队列除外。空:
打破
#以正确的顺序处理消息。
对于已排序的邮件(邮件):
打印(“{}:{}”。格式(进程id,消息[-1]))
def发送具有优先级的消息(目标队列、消息、优先级):
#以指定的优先级向目标队列发送消息。
目的地队列put((-优先级,消息))
def进程0(我的id,队列):
尽管如此:
#工作
打印(“正在工作…”)
时间。睡眠(5)
#接收消息
处理\u消息(我的\u id、队列[我的\u id])
def进程_1(我的_id,队列):
消息编号=0
尽管如此:
#工作
时间。睡眠(1)
#接收消息
处理\u消息(我的\u id、队列[我的\u id])
发送具有优先级的消息(队列[0],“这是来自进程{}的消息{}”。格式(消息号,我的id),1)
消息号+=1
def进程2(我的id,队列):
消息编号=0
尽管如此:
#工作
时间。睡眠(3)
#接收消息
处理\u消息(我的\u id、队列[我的\u id])
发送具有优先级的消息(队列[0],“这是来自进程{}的紧急消息{}”。格式(消息号,我的id),2)
消息号+=1
如果名称=“\uuuuu main\uuuuuuuu”:
qs={i:Queue()表示范围(3)中的i}
processs=[Process(target=p,args=(i,qs)),用于枚举中的i,p([Process_0,Process_1,Process_2])]
对于流程中的p:
p、 开始()
对于流程中的p:
p、 加入