Pythonの例(複数同時接続)
複数の同時接続を処理できるリモート・モード・プログラムを作成するには、ブロッキングを避けるために各接続を独立して処理しなければならない。 PythonAEフレームワークがこのタスクを実行する。 デフォルトでは、PythonAEフレームワークは各リクエストを処理するためにスレッドを使用します。 この機能をオーバーライドして、フレームワークをシングルスレッドで実行させたり、フォーキングを使って複数の同時リクエストを処理させたりすることも可能だ。
クラスで run() が呼び出されると、クラスはgetRequestHandlingStyle() を呼び出します。デフォルトでは、クラス変数 DEFAULT_REQUEST_HANDLING_STYLE を参照します。 より複雑な動作が必要な場合は、関数getRequestHandlingStyle() をオーバーロードするか、クラス変数 DEFAULT_REQUEST_HANDLING_STYLE をオーバーライドします。 この例では、シンプル・メソッドを使用してフレームワークを強制的にフォークさせ、現在のプロセス ID と親プロセス ID を返すことで、内部ハンドラが実行中のリモート AE と同じプロセスで実行されていないことを示します。
この例では以下のファイル名を使用している:
fork.py
コード
import nzae
class ForkAe(nzae.Ae):
DEFAULT_REQUEST_HANDLING_STYLE = nzae.Ae.REQUEST_HANDLING_STYLE__FORK
def _getFunctionResult(self, row):
return [parentProcessId, os.getpid()]
parentProcessId = os.getpid()
ForkAe.run()
デプロイメント
スクリプトをデプロイする:
$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language python64 \
--template deploy ./fork.py --version 3
登録
フォーキングAEとランチャーAEの両方を登録する:
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language python64 --version 3 \
--template udtf --exe fork.py --sig "remote_fork(int4)" \
--return "table(parent_id int4, child_id int4)" --remote \
--rname forkRemote
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language python64 --version 3 \
--template udtf --exe fork.py --sig "launch_remote_fork(int4)" \
--return "table(aeresult varchar(255))" --remote --launch \
--rname forkRemote
実行中
リモート AE サーバーを実行します:
SELECT * FROM TABLE WITH FINAL(launch_remote_fork(0));
AERESULT
-----------------------------------------------------------------------
tran: 8592 session: 16283 DATA slc: 0 hardware: 0 machine: TT4-R045 process:
32082 thread: 32082
(1 row)
次にフォークAEを実行する:
SELECT * FROM TABLE WITH FINAL(remote_fork(0));
PARENT_ID | CHILD_ID
-----------+----------
32082 | 32154
(1 row)
Pythonフレームワークがフォークを実行している。 DEFAULT_REQUEST_HANDLING_STYLE変数がオーバーライドされなければ、 リクエストを処理するために新しいプロセスが生成されなかったので、数値は 一致する。
これらの例では/nz/exportパスをハードコードしていますが、リリース用のAEを作成する場合、このパスは変数NZ_EXPORT_DIRを使用してコマンドnzenvで取得する必要があります。