Wenn ich versuche, mit seinem Jupyter-Client in Python-Code zu verbinden, gebe ich ein Problem.Kann Ergebnis der Rückgabe nicht erhalten Ergebnis jupyter zmq channel, wenn senden Sie es zu senden
In dem Quellcode jupyter, Verbindung zu ZMQ Kanal hergestellt wurde, als websocket
def open(self, kernel_id):
super(ZMQChannelsHandler, self).open()
try:
self.create_stream()
except web.HTTPError as e:
for channel, stream in self.channels.items():
if not stream.closed():
stream.close()
self.close()
else:
for channel, stream in self.channels.items():
//this is callback function when receive message from zqm channel
stream.on_recv_stream(self._on_zmq_reply)
während in der create_stream Funktion geöffnet wird, wurde der ZMQ Kanal eingerichtet.
def create_stream(self):
km = self.kernel_manager
identity = self.session.bsession
for channel in ('shell', 'iopub', 'stdin'):
meth = getattr(km, 'connect_' + channel)
self.channels[channel] = stream = meth(self.kernel_id, identity=identity)
stream.channel = channel
... ignore no significance code
, wenn der Server-Nachricht empfangen wurde ON_MESSAGE Zu diesem Zeitpunkt ZMQ Kanal empfangen Python-Code ausgeführt werden
def on_message(self, msg):
if not self.channels:
return
if isinstance(msg, bytes):
msg = deserialize_binary_message(msg)
else:
msg = json.loads(msg)
channel = msg.pop('channel', None)
if channel is None:
channel = 'shell'
if channel not in self.channels:
return
stream = self.channels[channel]
self.session.send(stream, msg)
aufzurufen. Danach sollte das Ausführungsergebnis zurückkommen, daher sollte die obige Funktion on_recv_stream aufgerufen werden und wir haben das Ergebnis schließlich erhalten.
So schreibe ich das Python-Code-Snippet wie folgt aus:
from jupyter_client.multikernelmanager import MultiKernelManager
from jupyter_client.session import Session
from tornado import gen, web
from tornado.concurrent import Future
from tornado.ioloop import IOLoop
km = MultiKernelManager()
kernelid = km.start_kernel()
kernel =km.get_kernel(kernelid)
channel = km.connect_shell(kernelid)
print 'channel', channel
def on_reply(msg):
print 'we got return'
def on_timeout():
print("Timeout waiting for kernel_info_reply: %s", kernel_id)
kernel.session.send(channel, 'kernel_info_request')
channel.on_recv(on_reply)
Eigentlich habe ich nicht die Rückmeldung bekommen haben, das heißt, die on_reply Funktion wurde nicht aufgerufen. Ich habe nicht das Problem, Kann mir niemand helfen?
'connect_shell' gibt Ihnen eine ZMQ * Steckdose *, kein * Strom *, die Rückrufe haben würde. Um einen Stream zu erhalten, rufen Sie 'kernel.client()' auf, um ein KernelClient-Objekt zu erhalten, und 'kc.start_channels()', um seine Kanäle einzurichten. Um einen Stream zu verwenden, müssen Sie jedoch die Ereignisschleife von pyzmq ausführen. Hier sind die Dokumente dafür: http://pyzmq.readthedocs.io/en/latest/eventloop.html?highlight=on_recv –