Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.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 多线程和ZMQ经销商/代表hello world不';行不通_Python_Zeromq_Pyzmq - Fatal编程技术网

Python 多线程和ZMQ经销商/代表hello world不';行不通

Python 多线程和ZMQ经销商/代表hello world不';行不通,python,zeromq,pyzmq,Python,Zeromq,Pyzmq,首先,我的代码(主要灵感来自ZMQ文档): 我已经用inproc和tcp套接字尝试了这段代码 inproc在工作人员尝试连接时出错 TCP只是在发送到经销商上后等待,没有来自worker的打印,经销商上没有收到其他消息 我考虑了慢连接问题,并添加了一个睡眠(一个在工作人员连接之前,一个在经销商的send()之前):这只会导致inproc的行为与TCP相同 PS:我为camelCase感到抱歉,但我对它上瘾了。我是通过以下方式实现的: 对于经销商,多部分发送您的信息,第一部分为空信息,第二部

首先,我的代码(主要灵感来自ZMQ文档):

我已经用inproc和tcp套接字尝试了这段代码

  • inproc在工作人员尝试连接时出错
  • TCP只是在发送到经销商上后等待,没有来自worker的打印,经销商上没有收到其他消息
  • 我考虑了慢连接问题,并添加了一个睡眠(一个在工作人员连接之前,一个在经销商的send()之前):这只会导致inproc的行为与TCP相同
PS:我为camelCase感到抱歉,但我对它上瘾了。

我是通过以下方式实现的:

  • 对于经销商,多部分发送您的信息,第一部分为空信息,第二部分为您的信息
  • 减少了计时器(但那个没用)
代码如下:

import zmq
import time
import sys
import threading

SOCKET_NAME = "tcp://127.0.0.1:8000"
#SOCKET_NAME = "inproc://mysocket"

def dealerRoutine(context):
    socket = context.socket(zmq.DEALER)
    socket.bind(SOCKET_NAME)
    time.sleep(1)
    socket.send("", zmq.SNDMORE)
    socket.send("hello")
    socket.send("", zmq.SNDMORE)
    socket.send("hello")
    print socket.recv()
    print socket.recv()
    socket.close()


def workerRoutine(context):
    socket = context.socket(zmq.REP)
    socket.connect(SOCKET_NAME)
    s = socket.recv()
    print s
    socket.send("world")

context = zmq.Context()

workers = []
for i in range(0, 2):
    worker = threading.Thread(target=workerRoutine, args=([context]))
    workers.append(worker) 
    worker.start()

dealerRoutine(context)

for worker in workers:
    worker.terminated = True

context.term()

感谢minrk对0 MQ专用IRC的帮助,问题在于多部分消息。读者可能会使用send_multipart(['',hello']),这相当于您使用zmq.SNDMORE标志所做的操作。对于发送到DealRoutine的所有内容,DealRoutine需要接收两次。因此,在本例中,它需要4个
print socket.recv()
语句。。。如果你尝试一下,你会发现它只在第二张和第四张上打印“世界”。不过,我还没有找到ZMQ中记录的地方。
import zmq
import time
import sys
import threading

SOCKET_NAME = "tcp://127.0.0.1:8000"
#SOCKET_NAME = "inproc://mysocket"

def dealerRoutine(context):
    socket = context.socket(zmq.DEALER)
    socket.bind(SOCKET_NAME)
    time.sleep(1)
    socket.send("", zmq.SNDMORE)
    socket.send("hello")
    socket.send("", zmq.SNDMORE)
    socket.send("hello")
    print socket.recv()
    print socket.recv()
    socket.close()


def workerRoutine(context):
    socket = context.socket(zmq.REP)
    socket.connect(SOCKET_NAME)
    s = socket.recv()
    print s
    socket.send("world")

context = zmq.Context()

workers = []
for i in range(0, 2):
    worker = threading.Thread(target=workerRoutine, args=([context]))
    workers.append(worker) 
    worker.start()

dealerRoutine(context)

for worker in workers:
    worker.terminated = True

context.term()