2017-03-11 5 views
1

ich versuche, ein REQ/REP Muster zu implementieren, mit python3 asyncio und ZeroMQpython3 asyncio ZeroMQ .Connect() blockiert

Mein Klient Asynchron-Funktion:

import zmq 
import os 
from time import time 
import asyncio 

import zmq.asyncio 


print ('Client %i'%os.getpid()) 

context = zmq.asyncio.Context(1) 
loop = zmq.asyncio.ZMQEventLoop() 
asyncio.set_event_loop(loop) 


async def client(): 
    socket = context.socket(zmq.REQ) 
    socket.connect('tcp://11.111.11.245:5555') 
    while True: 
     data = zmq.Message(str(os.getpid()).encode('utf8')) 
     start = time() 
     print('send') 
     await socket.send(data) 
     print('wait...') 
     data = await socket.recv() 
     print('recv') 
     print(time() - start, data) 


loop.run_until_complete(client()) 

Wie ich verstehe, wird der Anruf an eine socket.connect("tcp://11.111.11.245:5555") Methode ist eine Blockierungsmethode.

Wie mache ich eine nicht blockierende Verbindung, in meinem Fall?

Antwort

1

Soweit ich das ZeroMQ API verstehen, wird der Anruf an .connect() Methode nicht mit dem Aufbau der realen Verbindung synchron (wenn nicht durch die Umhüllung eingeführt, die zugrunde liegende API ist nicht blockierend - Ref. Unten).

Die Verbindung wird nicht sofort ausgeführt, sondern nach Bedarf von ØMQ. Somit zeigt ein erfolgreicher Aufruf von zmq_connect() nicht an, dass eine physikalische Verbindung hergestellt wurde oder tatsächlich hergestellt werden kann.

Ref.: ZeroMQ API - zmq_connect(3)