/ / Ogni volta che gli handler eseguiti devono inviare un messaggio a zeromq rimane sospeso - python, tornado, zeromq, pyzmq

Ogni volta che i gestori eseguiti devono inviare un messaggio a zeromq rimane sospeso - python, tornado, zeromq, pyzmq

Ho nginx di fronte a 8 istanze di Tornado,e per alcune richieste (un gestore per i commenti), ho bisogno di Tornado per inviare messaggi su ZeroMQ. Lo faccio alla fine del gestore (appena prima di inviare la risposta al client):

    # here is body of handler for comments

context = zmq.Context()
port = "5252"
socket = context.socket(zmq.PUSH)
socket.bind("tcp://*:%s" % port)
print "Running server on port: ", port
socket.send("Commented")

# here I flush response to client

Ma questo è sospeso. È questo il modo reale per inviare a ZeroMQ ogni volta che viene eseguito il gestore?

risposte:

0 per risposta № 1

È questo il modo reale per inviare a ZeroMQ ogni volta che viene eseguito il gestore?

No. Il tuo codice chiama zmq.Context () ogni volta che viene richiamato il gestore richieste. Questo non va bene. Dovrebbe essere chiamato esattamente una volta - di solito all'inizio del tuo processo, forse in una sorta di gestore di init. È possibile condividere in modo sicuro l'istanza di contesto tra qualsiasi numero di thread.

Stessa cosa con la creazione e il binding di socket -questo dovrebbe essere fatto una volta all'avvio. Devi stare più attento con la presa. Se tutti i gestori (applicazione, richiesta, ecc.) Sono in esecuzione nello stesso thread ogni volta che viene chiamato il gestore, è possibile utilizzare lo stesso socket.

Un altro problema è il modo in cui si "invia" a una presa PUSH. Come descritto in http://api.zeromq.org/3-2:zmq-socket, un invio a una presa PUSH potrebbe bloccarlo molto benedeterminate situazioni e probabilmente vorrai evitarlo. Utilizzare zmq.Poller con il flag POLLOUT (e un timeout 0) per determinare se l'invio potrebbe bloccare. In caso contrario, invia subito. In tal caso, devi decidere se vuoi semplicemente rilasciare il messaggio o archiviarlo nella tua applicazione per riprovare più tardi.