Why a ZeroMQ example does not work?

浪子不回头ぞ 提交于 2021-02-08 03:44:35

问题


I am new in Python/ ZeroMQ, so show forbearance if it is an easy question.

I try to run some examples, but it does not work really good.
Here is the hwserver/hwclient example of the ZeroMQ-Guide:


SERVER

#   Hello World server in Python
#   Binds REP socket to tcp://*:5555
#   Expects b"Hello" from client, replies with b"World"
#

import time
import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:

    message = socket.recv()               #  Wait for next request from client
    print("Received request: %s" % message)

    time.sleep(1)                         #  Do some 'work'

    print( "teeest" )

    socket.send(b"World")                 #  Send reply back to client

CLIENT

#    Hello World client in Python
#    Connects REQ socket to tcp://localhost:5555
#    Sends "Hello" to server, expects "World" back
#

import zmq

context = zmq.Context()

print("Connecting to hello world server…")    #  Socket to talk to server
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")


for request in range(10):                     #  Do 10 requests,
    #                                         #  waiting each time for a response
    print("Sending request %s …" % request)
    socket.send(b"Hello")

    message = socket.recv()                   #  Get the reply.
    print("Received reply %s [ %s ]" % (request, message))

And I am getting this output:

Connecting to hello world server…
Sending request 0 …
Received reply 0 [ b'World' ]
Sending request 1 …
Received reply 1 [ b'World' ]
Sending request 2 …
Received reply 2 [ b'World' ]
Sending request 3 …
Received reply 3 [ b'World' ]
Sending request 4 …
Received reply 4 [ b'World' ]
Sending request 5 …
Received reply 5 [ b'World' ]
Sending request 6 …
Received reply 6 [ b'World' ]
Sending request 7 …
Received reply 7 [ b'World' ]
Sending request 8 …
Received reply 8 [ b'World' ]
Sending request 9 …
Received reply 9 [ b'World' ]

Process finished with exit code 0

Could somebody tell me why I dont get the prints of the server like "Received request" and "teeeest"?

Thank you!


回答1:


why I don't get the prints of the server like "Received request" and "teeeest"?

Well,
you actually do get 'em,
but because you do not look into the right ( both ) place(s) ( if reading also from Server-side PyCharm / Terminal window, you will see 'em -- that's a good news ).

Welcome to the distributed-computing. Having two "roles" dancing together ( as coded in the REQ/REP or other of the ZeroMQ Scalable Formal Communication Pattern Archetypes ), you have to check both sides of the distributed-dancing to see the whole picture.

Watching just one side leaves you without the full story.

To make this more easily visible, let's modify the code a bit:


SERVER MOD :

import time
import zmq
context = zmq.Context()
socket  = context.socket( zmq.REP ); socket.bind( "tcp://*:5555" )

while True:
    message = socket.recv()               #  Wait for next request from client
    print( "TERMINAL[1]: SERVER has received request: %s" % message )
    time.sleep(1)                         #  Do some 'work'
    print( "TERMINAL[1]: SERVER puts teeest......................." )

    socket.send( b"World" )               #  Send reply back to client

CLIENT MOD :

import zmq

context = zmq.Context()

print( "TERMINAL[2] CLIENT says Connecting to hello world server…" )    

socket = context.socket( zmq.REQ )            #  Socket to talk to server
socket.connect( "tcp://localhost:5555" )

for request in range( 10 ):                   #  Do 10 requests,
    #                                         #  waiting each time for a response
    print( "TERMINAL[2] CLIENT Sending request %s …" % request )
    socket.send( b"Hello" )

    message = socket.recv()                   #  Get the reply.
    print( "TERMINAL[2] CLIENT Received reply %s [ %s ]" % ( request, message ) )

And this output you already "know":

TERMINAL[2] CLIENT says Connecting to hello world server…
TERMINAL[2] CLIENT Sending request 0 …
TERMINAL[2] CLIENT Received reply 0 [ b'World' ]
TERMINAL[2] CLIENT Sending request 1 …
TERMINAL[2] CLIENT Received reply 1 [ b'World' ]
TERMINAL[2] CLIENT Sending request 2 …
TERMINAL[2] CLIENT Received reply 2 [ b'World' ]
TERMINAL[2] CLIENT Sending request 3 …
TERMINAL[2] CLIENT Received reply 3 [ b'World' ]
TERMINAL[2] CLIENT Sending request 4 …
TERMINAL[2] CLIENT Received reply 4 [ b'World' ]
TERMINAL[2] CLIENT Sending request 5 …
TERMINAL[2] CLIENT Received reply 5 [ b'World' ]
TERMINAL[2] CLIENT Sending request 6 …
TERMINAL[2] CLIENT Received reply 6 [ b'World' ]
TERMINAL[2] CLIENT Sending request 7 …
TERMINAL[2] CLIENT Received reply 7 [ b'World' ]
TERMINAL[2] CLIENT Sending request 8 …
TERMINAL[2] CLIENT Received reply 8 [ b'World' ]
TERMINAL[2] CLIENT Sending request 9 …
TERMINAL[2] CLIENT Received reply 9 [ b'World' ]

So,
next just look into the other window / terminal,
where you will see all the intended SERVER-side print()-s:

TERMINAL[1]: SERVER has received request: b'Hello'
TERMINAL[1]: SERVER puts teeest.......................
TERMINAL[1]: SERVER has received request: b'Hello'
TERMINAL[1]: SERVER puts teeest.......................
TERMINAL[1]: SERVER has received request: b'Hello'
TERMINAL[1]: SERVER puts teeest.......................
TERMINAL[1]: SERVER has received request: b'Hello'
TERMINAL[1]: SERVER puts teeest.......................
TERMINAL[1]: SERVER has received request: b'Hello'
TERMINAL[1]: SERVER puts teeest.......................
TERMINAL[1]: SERVER has received request: b'Hello'
TERMINAL[1]: SERVER puts teeest.......................
...

Interested in mastering ZeroMQ as fast as possible ?

May enjoy a further 5-seconds read
about the main conceptual differences in [ ZeroMQ hierarchy in less than a five seconds ] or other posts and discussions here.




回答2:


It is not the client who should print the teeest but the server, because the print( "teeest" ) is instructed to be executed in the server file.

Your output shows the client's output but not the server's one.



来源:https://stackoverflow.com/questions/50692413/why-a-zeromq-example-does-not-work

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!