KDB+プロセス通信とCallbacks


KDB+ Callbacks


KDB+Qのプロセス通信は便利で、本節では主にIPC通信について話し、同期非同期の区別がある.同期はブロック待機、非同期はコールバックです.
公式サイトを参照してください.https://code.kx.com/v2/kb/ipc/
簡単なケース1:
1つの端末で開く
q -p 5000

1つの端末でq入力をオンにする
h:hopen `::5000                 //h 0 
h "a:1" 

これにより、5000ポートがオンになったプロセスにaが1の変数が格納され、同期して転送される.よろしい
h ({`a set x};1) 

これは関数にパラメータを加える方法です.1つ目は文字列q言語の方式である.
q)h ({`a set x;`b set y};1;2)

これは2つのパラメータを伝える形式です.非同期で実行することもできます.つまり、hという整数を逆数にとることです.
(neg h) "a:1";

簡単なケース2:同期と非同期は、5000プロセスでa:1を転送したばかりです.リモート・プロセスから読み出します.
q)h "a"

すぐに1に戻る
非同期読み込みの場合は空に戻ります.
(neg h) "a"

非同期は当時空に戻っていたので..では、どうやって非同期でデータを手に入れますか?
(neg h) "(.z.w )a";h(::) 

.z.wはあちらのプロセスがaを同期して送ってくるという意味です.h(:こちらのプロセスが受信することを示します.qインタラクションでこの2つの文を1行に書かなければなりませんが、qコードファイルには異なる位置に書くことができます.例えば、最初の行が非同期クエリー要求を送信した場合、100行目が受信することもできます.
上の知識を消化してから、さまざまな高級callbacksを下に見ることができます.
以下の例は公式サイトの例ですhttps://code.kx.com/v2/kb/callbacks/私はただ説明しただけです.
例1:
2つのqプロセスを開き、プロセス5000とプロセス5001は、プロセス5000(5000ビットポートのqプロセス)における次の2つの関数を定義する.
q)echo:{0N!x;}
q)add:{echo x+y} 

次の関数を5001ポートで定義します.
q)proc:{echo x; h:.z.w; (neg h) (y; 43)}
q)echo:{0N!x;}

5000プロセスで入力:
q)h:hopen `::5001
q)(neg h) (`proc; 42; `echo)
  ...
q)hclose h

q)(neg h)(proc; 42; echo)は、5001のproc関数を呼び出すことを意味し、この関数には2つのパラメータが必要であり、42は第1のパラメータとして、関数echoは第2のパラメータとして渡される.次にprocという関数が何をしたかを見てみましょう.最初のステップは自分のプロセスのecho関数を呼び出してxを印刷します.ここでxは5000ポートから伝わった最初のパラメータ42です.第2ステップの設定hは.z.w:ここのhは5001から5000ポートへの接続です.その後、5000ポートへの非同期の送信要求は、5000ポートのecho関数を呼び出すとともにパラメータ43に入力される.ここのyは私たちが5000から伝えた2番目のパラメータです.最終的に見るのは、5001ポート先印刷425000ポート印刷43である.
以上の内容は少し回りくどいように見えますが、非常に重要で、例1は理解して、後はかなり簡単です.
例2:
5001ポートにおける次の2つの関数のqプロセスを定義します.
q)add3:{x+y+z}
q)proc3:{ echo r:add3 . x; (neg .z.w) (y; r)}

5000ポートに入力:
q)(neg h) (`proc3; 1 2 3; `echo)

5001ポートのproc 3関数を呼び出し、同時に第1のパラメータ(1;2;3)に伝わり、第2のパラメータローカル5000ポートのecho関数の下で5001ポートが何をしたかを見る:第1歩:5000ポートから送られてきた1 2 3を加算して変数rを付与し、同時にrを印刷する.(.符号は配列を関数に対応するパラメータに変換して関数を実行し,後で詳細な章の説明がある.符号)第2歩:5000ポートに5000から送られてきたecho関数を非同期で呼び出し,関数のパラメータは計算したばかりのrであるため最終5000プログラム印刷65001プログラム印刷6
例3:
次のコードを5001プロセスに追加します.
q)add3:{x+y+z}
q)marshal:{(neg .z.w) (z; (value x) . y)}

5000プロセスで入力:
q)(neg h) (`marshal; `add3; 1 2 3; `echo)

リモート5001ポートのmarshal関数を呼び出し、3つのパラメータを入力します:パラメータ1はadd 3参照で、もちろんローカルにはこの関数は定義されていませんが、symbolタイプで、あちらの5001に着いたら関数名として呼び出すことができますので、知識の1つの関数名、2番目のパラメータは1 2 3配列で、3番目のパラメータはローカルのecho関数で、もちろんsymbolとしてもいいです.
リモート5001が受信した後、すぐに5000ポートにzを呼び出し、zは3番目のパラメータ、つまり私たちが伝えたecho関数です.z関数のパラメータは(value x).y value xは、関数名を関数自体に変換して実行する(私が書いた関数と右解析の文章を参照):従ってadd 3は直接(value`add)[1;2;3]ので5000ポートで6を印刷することができる.5001ポートは印刷されません.
例4:5000プロセス入力:
(neg h) ({(neg .z.w) (z; x*y)}; 6; 7; `echo)

すべての定義を一言に縮める...もしあなたがこの課題を理解すれば、自分で理解することができます.