通信

通信 はプロントエンドとカーネルの間でカスタムメッセージを許可します。例えば、ipywidgets でウィジェットの上タオを更新するために使用されます。

通信は、カーネルとフロントエンドのオブジェクトのぺあからんり、自動的に割り当てられたユニークなIDで構成されます。一方の側がメッセージを送信すると、他方の側のコールバックがそのメッセージデータで鳥がされます。いずれかの側、フロントエンドまたはカーネルは、通信を開いたり閉じたり出来ます。

参考

Custom Messages
通信に関するメッセージ仕様セクション

カーネルから通信を開く

まず、通信を受け入れる機能がフロントエンドで利用可能でなければなりません。これは requirejs モジュールで指定するか、extension がロードされた時などにレジストリに登録することが出来ます。この例は、レジストリに登録されているフロントエンドの通信ターゲットを示しています:

Jupyter.notebook.kernel.comm_manager.register_target('my_comm_target',
    function(comm, msg) {
        // comm is the frontend comm instance
        // msg is the comm_open message, which can carry data

        // Register handlers for later messages:
        comm.on_msg(function(msg) {...});
        comm.on_close(function(msg) {...});
        comm.send({'foo': 0});
    });

フロントエンド通信が登録されたので、カーネルから通信を開くことが出来ます:

from ipykernel.comm import Comm

# Use comm to send a message from the kernel
my_comm = Comm(target_name='my_comm_target', data={'foo': 1})
my_comm.send({'foo': 2})

# Add a callback for received messages.
@my_comm.on_msg
def _recv(msg):
    # Use msg['content']['data'] for the data in the message

この例では、IPythonカーネルを使用しています。各言語のカーネルには、もしAPIがあれば通信を使用するために提供されます。

フロントエンドから通信を開く

これは上記と非常によく似ていますが、逆です。まず、カーネルに通信ターゲットを登録する必要があります。例えば、これは出力をコード表示することでにって行うことが出来ます。カーネルにターゲットを登録し、それに接続するためのJavascriptを含む出力を表示します。

def target_func(comm, msg):
    # comm is the kernel Comm instance
    # msg is the comm_open message

    # Register handler for later messages
    @comm.on_msg
    def _recv(msg):
        # Use msg['content']['data'] for the data in the message

    # Send data to the frontend
    comm.send({'foo': 5})

get_ipython().kernel.comm_manager.register_target('my_comm_target', target_func)

この例では、IPythonカーネルをサイド使用します。この例は、通信をサポートする他のカーネルでは異なります。通信のサポートについては特定の言語カーネルのドキュメントを参照して下さい。

フロント エンドからの通信を開きます:

comm = Jupyter.notebook.kernel.comm_manager.new_comm('my_comm_target',
                                                     {'foo': 6})
// Send data
comm.send({'foo': 7})

// Register a handler
comm.on_msg(function(msg) {
    console.log(msg.content.data.foo);
});