1

首先是我的代码(很大程度上来自 ZMQ 文档http://zguide.zeromq.org/py:mtserver):

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(12)
    socket.send("hello")
    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()

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

  • 当工作人员尝试连接时,inproc 会出错
  • TCP 只是在经销商发送后等待,工人没有打印,经销商没有收到其他消息
  • 我已经想到了慢连接器问题并添加了一个睡眠(一个在工人连接之前,一个在经销商的 send() 之前):这只会导致 inproc 的行为与 TCP 相同。

PS:我很抱歉camelCase,但我对它上瘾了。

4

1 回答 1

3

我通过以下方式使其工作:

  • 对于经销商,多部分发送您的消息,第一部分是空消息,第二部分是您的消息
  • 减少了计时器(虽然那个没有帮助)

这是代码:

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()
于 2012-10-16T20:59:25.330 回答