WSTPServer入門
WSTPServerは,WSTPの着信接続についてWolfram言語カーネルを起動および管理するサーバプログラムである.これはWSTPの単独のエンドポイントでリスンし,任意の数のクライアントがカーネルを取得するために既知の場所に接続することを許可する.
これは,管理するカーネルへのすべてのトラフィックを転送し,WSTPServerへのリンクがあたかもカーネルへの直接のリンクであるかのように動作することを可能にする.カーネルは,カーネルプールを使うことで特定の特性で設定することができる.WSTPServerカーネルに接続したり,その接続を解除したり,再接続したりすることができるため,別のプログラムやマシンから接続できる,長時間利用可能なセッションを維持することができる.最も簡単なレベルでは,WSTPServerは新しいカーネルが必要なときに起動するより一般的な方法に代る,起動済みで設定済みのWolfram言語カーネルのプロバイダと考えることができる.
WSTPServerはサーバプログラムであり,これに接続するためには実行中でなければならない.
$ /Applications/Mathematica.app/Contents/SystemFiles/Links/WSTPServer/wstpserver
WSTPServer: Logger (0, 2020-09-29 16:50:00): Information:
Using "/Applications/Mathematica.app/Contents/MacOS/WolframKernel" as a default kernel path
WSTPServer: Logger (0, 2020-09-29 16:50:05): Information:
Listening for new connections on port 31415
...
$ "C:\Program Files\Wolfram Research\Mathematica\12.2\SystemFiles\Links\WSTPServer\wstpserver.exe"
WSTPServer: Logger (0, 2020-09-29 16:50:00): Information:
Using "C:\Program Files\Wolfram Research\Mathematica\12.2\wolfram.exe" as a default kernel path
WSTPServer: Logger (0, 2020-09-29 16:50:05): Information:
Listening for new connections on port 31415
...
Linuxではターミナルで以下を実行してWSTPServerを起動する:
$ /usr/local/Wolfram/Mathematica/12.2/SystemFiles/Links/WSTPServer/wstpserver
WSTPServer: Logger (0, 2020-09-29 16:50:00): Information:
Using "/usr/local/Wolfram/Mathematica/12.2/Executables/WolframKernel" as a default kernel path
WSTPServer: Logger (0, 2020-09-29 16:50:05): Information:
Listening for new connections on port 31415
...
上記に関して,Wolfram言語12.2以降のレイアウトにだけwstpserverが含まれていることに注意すること.製品がMathematica以外(例:Wolfram Desktop等)の場合は,パスを適切なものに変更する必要がある.
Wolfram言語のカーネルは通常ユーザとの接続により制限される.接続がなくなると関連したカーネルもなくなり,進行中の作業が中断される.しかしWSTPServerを使うと,カーネルを失ったり作業を中断することなくカーネルから接続を解除し,後で同じカーネルに再接続することができる.
WSTPServerでカーネルに接続することの利点は,ファイルをロードし,定義を作成し,式を評価する等して状態を積み上げてからでも,後でそのカーネルに別のマシンからでも再接続できるようにカーネルを有効なままにしておくことができる点である.この例はセクション「以前使ったカーネルにブリッジする」に挙げる.
別の利点として,WSTPServerはネットワーク接続の中断によるカーネルの停止を阻止することができるため,カーネルの作業が継続できるというものがある.ネットワーク上の接続は不安定になり維持できなくなる場合がある.中断されたカーネルに戻るためには,WSTPServerに再接続し,中断したカーネルへの接続を確立するだけでよい.
最後の例は実行時間の長い計算に関連したものである.ユーザはWSTPServerで管理されるカーネルで長い計算を開始し,終了が予定されているときにカーネルに戻り結果を得ることができる.最初のカーネルがビジーのときは,WSTPServerで管理される別のカーネルに接続してタスクを実行することもできる.
カーネルはすべて,そのカーネルに接続するために使うことのできるカーネルIDを持つ.このIDはそのカーネル内でWSTPServer`GetKernelID[]を評価するかWSTPコマンドGetKernelIDを使うかして取得することができる.
このドキュメントでは「ブリッジ」という言葉をよく使う.WSTPServerは仲介者のような働きをし,クライアントとカーネルとの間の通信を往来させる.ブリッジとはWSTPServerがクライアントとカーネルの間に確立した接続のことである.「アンブリッジ」とはクライアントとカーネルの間の接続を終了することである.それでもクライアントは別のカーネルにブリッジすることができる.
カーネルプールとは,初期化コード等のユーザ設定の特性を共有するカーネルのグループのことである.WSTPServerで管理されるカーネルのほとんどは,このようなプールのメンバであると想定されており,少なくとも1つのカーネルプールがデフォルトのプールとして設定されなくてはならない.デフォルトプールのカーネルは,特定のカーネルあるいはプールを要求しない接続に提供される.複数のカーネルプールを設定することで,さまざまな用途に対して事前に初期化された別々のカーネル集合を使うことができる.
デフォルトプールおよびカーネルプール一般についての設定処理に関する詳細は,「設定ファイル」を参照のこと.特定のカーネルへの接続については,Wolfram言語関数WSTPServer`ConnectKernelおよびWSTPコマンドConnectKernelを参照されたい.セクション「特別に設定されたプールへのブリッジ」には,特定のカーネルプールへのブリッジでWSTPServer`ConnectKernelを使う方法を解説した例がある.
このセクションでは,広く使われるそのようなコンポーネントの多くとWSTPServerを使うことについて説明する.
WolframScriptとの使用
WolframScriptはWolfram言語のコード,関数,配備されたAPIを実行することができる,Wolfram言語のためのコマンドラインスクリプトインタプリタである.WolframScriptはWSTPServerに接続しそのカーネルとインタラクトすることもできる.
$ wolframscript -wstpserver -code "StringReverse[\"hello\"]"
olleh
WolframScriptでは,WSTPServerカーネルに簡単に再接続することができる.これを安全に行うためには,ユーザが管理しなければならないファイルシステム上の profiles で特定のカーネルへの接続を追跡することをお勧めする.WolframScriptは,カーネルへの再接続を許可するために,使用されているカーネルのIDをプロファイルファイルに記録する.
WSTPServerなしでWolframScriptを使う場合は,計算の度に新しいカーネルを使わなければならない.-startprofileおよび-continueprofileでWSTPServerを使うと,複数のWolframScriptの計算すべてで同じカーネルを使ったセッションを維持することができる.
プログラムページ「WolframScript」の「詳細」にはプロファイルシステムおよびオプション-wstpserver,-startprofile,-continueprofileについての詳しい説明が書いてある.セクション「オプション」では,WolframScriptのコマンドラインオプションの高レベルな概要を見ることができる.
ノートブックインターフェースとの使用
以下ではノートブックフロントエンドとWSTPServerの接続方法およびそのカーネルとインタラクトする方法を説明する:
4. 「詳細設定」を選ぶ.「MLOpenの引数」というフィールドに以下のように入力する.ここで「port」と「host」(オプショナル)はそれぞれWSTPServerがリスンしているポートとホストに置き換える.
並列計算での使用
WSTPServerは並列計算機能で使用するために,並列カーネルプールを管理することができる.並列計算機能には,WSTPServer並列カーネルに接続するために追加の設定が必要である.セクション「並列計算機能の利用」には,フロントエンドを使うときのこのプロセスを説明する例題が提供されている.
WSTPのCバインディングとの使用
自分のWSTPプログラムからWSTPServerに接続するのは簡単である.WSTPServerへのWSTP接続は,通常のカーネルへの接続とほぼ同じである.通常,WSTPServerはクライアントが接続するとInputNamePacketをクライアントに送る.その後WSTPServerはクライアントからの通信をすべてカーネルに送り,カーネルからの通信をすべてクライアントに送る.クライアントの視点からすると,カーネルへの直接リンクのように見える.
この説明での大きな例外は,WSTPServerではWSTP接続においてコマンドのクラスをWSCommandPacketパケットで送ることができるという点である.これらのコマンドはWSTPServerによって妨害され,カーネルに転送されない.これらのコマンドの説明は「コマンド言語」セクションに記載されている.
次のサンプルプログラムはWSTPServerに接続し,計算を実行する.これはリンクが開かれる方法以外は,完全に標準的なWSTPプログラムである.WSOpenStringへの呼出しに"-linkmode connect -linkname 31415 -linkprotocol TCPIP -linkoptions 4"の指定があることに注目されたい.
/************************************
include directives
*************************************/
#include "stdio.h" /* printf */
#include "wstp.h" /* WSENV, WSLINK, WSInitialize, WSOpenArgcArgv, ... */
/************************************
define directives
*************************************/
#define WSTP_ENVIRONMENT_ERROR 1
#define WSTP_OPEN_ERROR 2
#define WSTP_ACTIVATION_ERROR 3
#define WSTP_INPUTNAMEPACKET_ERROR 4
#define WSTP_GENERAL_ERROR 5
/************************************
connecting to a link server
*************************************/
/* entry point */
int main(int argc, char **argv)
{
WSENV env;
WSLINK link;
int error;
/* initialize a WSTP environment */
env = WSInitialize(NULL);
if(env == NULL)
{
(void) printf("%s\n", "Could not initialize a WSTP environment");
return WSTP_ENVIRONMENT_ERROR;
}
/* open a link to a WSTPServer listening on port 31415 on the local machine */
link = WSOpenString(env, "-linkmode connect -linkname 31415 -linkprotocol TCPIP -linkoptions 4", &error);
if(link == NULL || error)
{
(void) printf("%s\n", "Could not open a link to WSTPServer");
return WSTP_OPEN_ERROR;
}
/* activate the link to WSTPServer */
error = WSActivate(link);
if(!error)
{
(void) printf("%s\n", "Could not activate the link to WSTPServer");
return WSTP_ACTIVATION_ERROR;
}
/* receive InputNamePacket packet */
if(WSNextPacket(link) != INPUTNAMEPKT)
{
(void) printf("%s\n", "Could not receive InputNamePacket packet");
return WSTP_INPUTNAMEPACKET_ERROR;
}
(void) WSNewPacket(link);
/* send over the link:
EvaluatePacket[2 + 2] */
if(
!(
WSPutFunction(link, "EvaluatePacket", 1) &&
WSPutFunction(link, "Plus", 2) &&
WSPutInteger(link, 2) &&
WSPutInteger(link, 2) &&
WSFlush(link)
)
)
{
(void) printf("%s\n", "General WSTP error occurred");
return WSTP_GENERAL_ERROR;
}
/* read off packets until ReturnPacket */
while(
(WSNextPacket(link) != RETURNPKT) &&
(WSError(link) == WSEOK)
) { }
if(WSError(link) != WSEOK)
{
(void) printf("%s\n", "General WSTP error occurred");
return WSTP_GENERAL_ERROR;
}
/* clean up */
(void) WSClose(link);
(void) WSDeinitialize(env);
return 0;
}
設定ファイルはまず現在の作業ディレクトリで検索され,次にapplication dataディレクトリで検索される.有効な設定ファイルが存在しない場合,デフォルトのコンテンツを含む設定ファイルがapplication dataディレクトリ内に生成される.
{
# Lines that begin with # are comments
# "AllowStealingKernels":false,
# "AllowSilentKernelReplacement":false,
# "EnableAutomaticKernelConnection":false,
# "SendInputNamePacketUponKernelConnection":true,
"Pools":
{
"KernelPoolOne":
{
# "Default":true,
# Only uncomment one of the "KernelPath" lines below
# Make sure to change the value to reflect the actual location of your Wolfram kernel binary
# "KernelPath":"C:\\Program Files\\Wolfram Research\\Mathematica\\13.2\\wolfram",
# "KernelPath":"/usr/local/Wolfram/Mathematica/13.2/Executables/WolframKernel",
# "KernelPath":"/Applications/Mathematica.app/Contents/MacOS/WolframKernel",
# "InitializationCode":"x=2+2",
# "InitializationFile":"/path/to/your/initialization/file.wl",
# "KernelOptions":"-yourkerneloption1 -yourkerneloption2",
# "KeepAlive":true,
# "MinimumKernelNumber":2,
# "ParallelKernels":false,
# "ReservePreviouslyConnectedKernels":false
},
# "KernelPoolTwo":
# {
# "ParallelKernelDefault":true,
# "ParallelKernels":true,
# Only uncomment one of the "KernelPath" lines below
# Make sure to change the value to reflect the actual location of your Wolfram kernel binary
# "KernelPath":"C:\\Program Files\\Wolfram Research\\Mathematica\\13.2\\wolfram",
# "KernelPath":"/usr/local/Wolfram/Mathematica/13.2/Executables/WolframKernel",
# "KernelPath":"/Applications/Mathematica.app/Contents/MacOS/WolframKernel"
# }
}
}
鍵-値ペア
WSTPServerは設定ファイルの中で以下のルート鍵を認識する:
AllowStealingKernels |
true
| すでに別のクライアントにブリッジされているカーネルにブリッジするために,クライアントがカーネルIDを使うことができるかどうか | |
AllowSilentKernelReplacement |
false
| ブリッジされたカーネルが失われたとき,クライアントリンクを閉じることなく,新しいカーネルが失われたカーネルに代って静かに開始するかどうか | |
EnableAutomaticKernelConnection |
false
| 最初の非WSCommandPacket式がクライアントリンク上で送られたときだけカーネルにブリッジするのではなく,デフォルトプールのカーネルが接続と同時に直ちにクライアントリンクでブリッジされるかどうか | |
Pools | required | WSTPServerが使うプールのリスト | |
SendInputNamePacketUponKernelConnection |
true
| クライアント接続の後に起こるブリッジイベントのためにInputNamePacketを送るかどうか |
AllowStealingKernelsがtrueに設定されていると,コンピュータを別のものに替えても,もとのコンピュータでカーネルからアンブリッジすることなく,同じカーネルセッションを維持することができる.
AllowSilentKernelReplacementがtrueに設定されていると,WSTPServer自身が閉じたカーネル(例:KeepAliveフラグがfalseに設定されていたため,等)は代替されない.AllowSilentKernelReplacementがfalseの場合,ブリッジされたカーネルが失われると,そのカーネルにブリッジされていたクライアントリンクは閉じる.
EnableAutomaticKernelConnectionがtrueに設定されていると,クライアントリンクが構築されるとすぐにそれにブリッジされる.カーネルが必要とされる前に準備されることになるため,クライアントリンクを使った最初の評価にかかる時間を短縮することができる.
Default | automatic | 新しいクライアントに対してこのプールをデフォルトとして使うかどうか | |
InitializationCode | "" | プール内のカーネルについて実行する初期化コード | |
InitializationFile |
""
| プール内のカーネルについて実行する初期化ファイル | |
KernelPath | automatic | プール内のカーネルが実行するWolfram言語カーネルの実行ファイルへのパス | |
KernelOptions | "" | プール内のカーネルが実行するWolfram言語カーネルの実行ファイルに対する追加のコマンドラインオプション | |
KeepAlive |
true
| カーネルを無限に有効なままにしておくか,アンブリッジされたときに閉じるか | |
MaximumKernelNumber | automatic | プールが含むことのできる実行中のカーネルの最大数 | |
MinimumKernelNumber |
2
| プールが常に含むことのできる実行中のカーネルの最小数 | |
ParallelKernelDefault | automatic | 並列計算のときにこのプールをデフォルトとして使うかどうか | |
ParallelKernels |
false
| プールのカーネルを並列計算用に設定するかどうか | |
ReservePreviouslyConnectedKernels | true | 以前ブリッジされたカーネルが,IDで要求するクライアントとだけ再びブリッジできるかどうか |
WSTPServerは起動時に,MinimumKernelNumberの値に等しい数のカーネルを事前に起動する.これらのカーネルは設定ファイルの鍵InitializationCodeまたはInitializationFileでウォームアップすることができる.
KeepAliveがtrueに設定されていると,クライアントが接続を解除してもカーネルは閉じないので,同じクライアントと再び接続することも別のクライアントと接続することもできる.クライアントはQuitまたはExitはなくWolfram言語関数WSTPServer`DisconnectKernelかWSTPコマンドDisconnectKernelを使うように気を付けなければならない.前者を使うとカーネルは終了してしまう.
WSTPServerはコマンドを使って動的に制御することができる.コマンドはWSCommandPacketと呼ばれる特別なラッパーでWSTPを介して直接WSTPServerに送られる.これらのコマンドの結果はReturnPacketパケットで送り返される.WSCommandPacket機能はWSTPServerを使って自分自身のWSTPプログラムを書く開発者向けである.WSCommandPacketの例は「WSTPのCバインディングとの使用」に挙げてある.
CloseKernel | 指定されたカーネルを閉じる | |
ConnectKernel | 指定されたカーネルとの現行の接続をブリッジする | |
ConnectParallelKernel | 並列カーネルのデフォルトプールで利用可能な最初のカーネルとの現行の接続をブリッジする | |
DisconnectKernel | ブリッジされたカーネルとの現行の接続をアンブリッジする | |
GetKernelBusyStatus | 現行の接続にブリッジされたカーネルが評価で忙しいかどうかを知らせる | |
GetKernelID | 現行の接続にブリッジされたカーネルのIDを取得する | |
GetNumberOfAvailableParallelKernels | 並列カーネルのデフォルトプルーフで利用可能なカーネル数を取得する | |
GetPoolName | 現行の接続にブリッジされたカーネルのプールの名前を取得する | |
GetServerInformation | すべてのプールおよびカーネルの情報を得る | |
SetAllowSilentKernelReplacement | 現行の接続にブリッジされたカーネルが失われた場合に,通知なしでそのカーネルの代替を許可するかどうかを設定する | |
SetKeepAlive | 現行の接続が切れたりブリッジが終了したりした場合に,現行の接続にブリッジされたカーネルを閉じるかどうかを設定する | |
SetReserveKernel | 現行のカーネルがアンブリッジされたときに,そのカーネルをIDでリクエストするクライアントにのみブリッジすることができるかどうかを設定する | |
StartKernel | プール外部のカーネルを開始し,そのIDを返す |
次のサブセクションではこれらのWSTPコマンドについて詳しく説明する.
WSTPコマンド:CloseKernel
成功するとReturnPacket["{\"status\":\"ExecutionSuccess\"}"]が返され,失敗するとReturnPacket["{\"status\":\"ExecutionError\"}"]が返される.
WSTPコマンド:ConnectKernel
WSCommandPacket[ConnectKernel[]]はデフォルトプールで利用可能なカーネルとの現行の接続をブリッジする.そのカーネルが前にブリッジされたクライアントからの計算でまだ忙しい場合,関数はデフォルトの短いタイムアウト期間待機してから失敗となる.
WSCommandPacket[ConnectKernel["kernelSpecifier"]]は,kernelSpecifier がカーネルIDのときID kernelSpecifier でそのカーネルとの現行の接続をブリッジする.kernelSpecifier がカーネルプール名のときは,名前 kernelSpecifier でカーネルプールの利用可能なカーネルとの現行の接続をブリッジする.kernelSpecifier がカーネルIDのとき,指定されたカーネルとの既存のブリッジは終了する.カーネルが前にブリッジされたクライアントからの評価で忙しい場合は,関数はデフォルトの短いタイムアウト期間を待ってから失敗となる.
WSCommandPacket[ConnectKernel["kernelSpecifier", timeout]]は,kernelSpecifier がカーネルIDのときID kernelSpecifier でそのカーネルとの現行の接続をブリッジする.kernelSpecifier がカーネルプール名のときは,名前 kernelSpecifier でカーネルプールの利用可能なカーネルとの現行の接続をブリッジする.kernelSpecifier がカーネルIDのとき,指定されたカーネルとの既存のブリッジは終了する.カーネルが前にブリッジされたクライアントからの評価で忙しい場合は,関数は timeout 秒待ってから失敗となる.
成功するとReturnPacket["{\"status\":\"ExecutionSuccess\"}"]が返され,失敗するとReturnPacket["{\"status\":\"ExecutionError\"}"が返される.
WSTPコマンド:ConnectParallelKernel
WSCommandPacket[ConnectParallelKernel[]]は並列カーネルのデフォルトプールで利用可能なカーネルとの現行の接続をブリッジする.カーネルが前にブリッジされたクライアントからの評価で忙しい場合は,関数はデフォルトの短いタイムアウト期間待ってから失敗となる.
WSCommandPacket[ConnectParallelKernel[timeout]] は並列カーネルのデフォルトプールで利用可能なカーネルとの現行の接続をブリッジする.カーネルが前にブリッジされたクライアントからの評価で忙しい場合は,関数は timeout 秒待ってから失敗となる.
成功すると
ReturnPacket["{\"status\":\"ExecutionSuccess\"}"]
返され,失敗すると
ReturnPacket["{\"status\":\"ExecutionError\"}"]
が返される.
WSTPコマンド:DisconnectKernel
成功すると
ReturnPacket["{\"status\":\"ExecutionSuccess\"}"]
が返され,失敗すると
ReturnPacket["{\"status\":\"ExecutionError\"}"]
が返される.
WSTPコマンド:GetKernelBusyStatus
WSCommandPacket[GetKernelBusyStatus[]]は,現在の接続にブリッジされたカーネルが評価で忙しいかどうかを知らせる.この関数は,現在の接続がブリッジされていない場合は失敗となる.
成功するとReturnPacket["{\"result\":\"True\"}"]またはReturnPacket["{\"result\":\"False\"}"]が返され,失敗するとReturnPacket["{\"status\":\"ExecutionError\"}"]が返される.
WSTPコマンド:GetKernelID
成功すると
ReturnPacket["{\"result\":\"
id
\"}"]
が返され,失敗すると
ReturnPacket["{\"status\":\"ExecutionError\"}"]
が返される.
WSTPコマンド:GetNumberOfAvailableParallelKernels
成功するとReturnPacket["{\"result\":\"num\"}"]が返され,失敗するとReturnPacket["{\"status\":\"ExecutionError\"}"]が返される.num の値は並列カーネルのデフォルトプールで利用できるカーネル数である.
WSTPコマンド:GetPoolName
成功すると
ReturnPacket["{\"result\":\"
name
\"}"]
が返され,失敗すると
ReturnPacket["{\"status\":\"ExecutionError\"}"]
が返される.
WSTPコマンド:GetServerInformation
成功するとReturnPacket["json"]が返され,失敗するとReturnPacket["{\"status\":\"ExecutionError\"}"]が返される.成功すると json は次のJSONスキーマと合致する:
{
"result":
{
# An object containing configured pools and their properties
"Pools":
{
string: # The name of a particular pool
# An object containing the properties of a particular pool and their values
{
"InitializationCode":string,
"InitializationFile":string,
"MaximumKernelNumber":number,
"MinimumKernelNumber":number,
"KeepAlive":Boolean,
"EntryPool":Boolean,
"KernelPath":string,
"PreferFreshKernel":Boolean,
"ReservePreviouslyConnectedKernels":Boolean,
"ParallelKernels":Boolean,
"ParallelKernelEntryPool":Boolean
},
...
}
}
}
}
WSTPServerを監視することについて,類似のWolfram言語関数WSTPServer`GetServerInformationの使用法を説明するセクション「WSTPServerの監視」に例が挙げてある.
WSTPコマンド:SetAllowSilentKernelReplacement
WSCommandPacket[SetAllowSilentKernelReplacement[setting]] は,カーネルが失われたときに,現行の接続にブリッジされているカーネルのサイレントの再起動を許可するかどうかを設定する.setting の値はTrueかFalseである.
現在の接続がブリッジされていない場合,SetAllowSilentKernelReplacementは失敗となる.SetAllowSilentKernelReplacementは現在のブリッジという点で,AllowSilentKernelReplacement設定ファイル鍵をオーバーライドする.
成功するとReturnPacket["{\"status\":\"ExecutionSuccess\"}"]が返され,失敗するとReturnPacket["{\"status\":\"ExecutionError\"}"]が返される.
WSTPコマンド:SetKeepAlive
WSCommandPacket[SetKeepAlive[setting]]は,現在の接続が失われたりブリッジが終了したりした場合に,現在の接続にブリッジされているカーネルを閉じるかどうかをWSTPServerに指示する.setting の値はTrueかFalseである.
成功すると
ReturnPacket["{\"status\":\"ExecutionSuccess\"}"]
が返され,失敗すると
ReturnPacket["{\"status\":\"ExecutionError\"}"]
が返される.
WSTPコマンド:SetReserveKernel
WSCommandPacket[SetReserveKernel[setting]]は,現在のカーネルがアンブリッジされたときに,IDでリクエストするクライアントにのみブリッジできるかどうかを設定する.setting の値はTrueかFalseでなければならない.
現在の接続がブリッジされていない場合,またはカーネルがプールの一部ではない場合,SetReserveKernelは失敗となる.SetReserveKernelのカーネルへの効果はブリッジイベントにまで持続する.SetReserveKernelはブリッジに関してReservePreviouslyConnectedKernels設定ファイル鍵をオーバーライドする.
成功すると
ReturnPacket["{\"status\":\"ExecutionSuccess\"}"]
が返され,失敗すると
ReturnPacket["{\"status\":\"ExecutionError\"}"]
が返される.
WSTPコマンド:StartKernel
成功すると
ReturnPacket["{\"result\":\"
id
\"}"]
が返され,失敗すると
ReturnPacket["{\"status\":\"ExecutionError\"}"]
が返される.
前のセクションではWSCommandPacketパケットを使ってWSTPServerを制御する低レベルの方法を説明した.Wolfram言語関数にも,WSTPServerカーネルがWSTPServerにアクセスしそれを制御することを可能にするものがある.
WSTPServer`CloseKernel | 指定されたカーネルを閉じる | |
WSTPServer`ConnectKernel | 指定されたカーネルとの現行の接続をブリッジする | |
WSTPServer`DisconnectKernel | ブリッジされたカーネルとの現行の接続をアンブリッジする | |
WSTPServer`GetKernelID | 現行の接続にブリッジされたカーネルのIDを取得する | |
WSTPServer`GetPoolName | 現行の接続にブリッジされたカーネルのプールの名前を取得する | |
WSTPServer`GetServerInformation | すべてのプールおよびカーネルの情報を得る | |
WSTPServer`SetAllowSilentKernelReplacement | 現行の接続にブリッジされたカーネルが失われた場合に,通知なしでそのカーネルの代替を許可するかどうかを設定する | |
WSTPServer`SetKeepAlive | 現行の接続が切れたりブリッジが終了したりした場合に,現行の接続にブリッジされたカーネルを閉じるかどうかを設定する | |
WSTPServer`SetReserveKernel | 現行のカーネルがアンブリッジされたときに,そのカーネルをIDでリクエストするクライアントにのみブリッジすることができるかどうかを設定する | |
WSTPServer`StartKernel | プール外部のカーネルを開始し,そのIDを返す |
Wolfram言語関数:WSTPServer`CloseKernel
Wolfram言語関数:WSTPServer`ConnectKernel
WSTPServer`ConnectKernel[] はデフォルトプールで利用可能なカーネルとの現行の接続をブリッジする.カーネルが前にブリッジされたクライアントからの評価で忙しい場合は,関数はデフォルトの短いタイムアウト期間を待ってから失敗となる.
WSTPServer`ConnectKernel["kernelSpecifier"]は,kernelSpecifier がカーネルIDのときID kernelSpecifier でそのカーネルとの現行の接続をブリッジする.kernelSpecifier がカーネルプール名のときは,名前 kernelSpecifier でカーネルプールの利用可能なカーネルとの現行の接続をブリッジする.kernelSpecifier がカーネルIDのとき,指定されたカーネルとの既存のブリッジは終了する.カーネルが前にブリッジされたクライアントからの評価で忙しい場合は,関数はデフォルトの短いタイムアウト期間を待ってから失敗となる.
WSTPServer`ConnectKernel["kernelSpecifier", timeout]は,kernelSpecifier がカーネルIDのときID kernelSpecifier でそのカーネルとの現行の接続をブリッジする.kernelSpecifier がカーネルプール名のときは,名前 kernelSpecifier でカーネルプールの利用可能なカーネルとの現行の接続をブリッジする.kernelSpecifier がカーネルIDのとき,指定されたカーネルとの既存のブリッジは終了する.カーネルが前にブリッジされたクライアントからの評価で忙しい場合は,関数は timeout 秒待ってから失敗となる.
Wolfram言語関数:WSTPServer`DisconnectKernel
Wolfram言語関数:WSTPServer`GetKernelID
Wolfram言語関数:WSTPServer`GetPoolName
Wolfram言語関数:WSTPServer`GetServerInformation
WSTPServerの監視について,同様のWolfram言語関数WSTPServer`GetServerInformationの使用法を説明する例がセクション「WSTPServer`SetAllowSilentKernelReplacement」に挙げてある.
Wolfram言語関数:WSTPServer`SetAllowSilentKernelReplacement
WSTPServer`SetAllowSilentKernelReplacement[setting]は,カーネルが失われたときに,現行の接続にブリッジされているカーネルのサイレントの再起動を許可するかどうかを設定する.setting の値はTrueかFalseである.
現在の接続がブリッジされていない場合,WSTPServer`SetAllowSilentKernelReplacementは失敗となる.WSTPServer`SetAllowSilentKernelReplacementは現在のブリッジという点で,AllowSilentKernelReplacement設定ファイル鍵をオーバーライドする.
Wolfram言語関数:WSTPServer`SetKeepAlive
WSTPServer`SetKeepAlive[setting] は,現在のカーネルがアンブリッジされた場合に,そのカーネルのIDでリクエストするクライアントだけにカーネルをブリッジするかどうかを設定する.setting の値はTrueかFalseである.
現在の接続がブリッジされていない場合,またはカーネルがプールの一部ではない場合,WSTPServer`SetKeepAliveは失敗となる.カーネルに対するWSTPServer`SetKeepAliveの効果はブリッジイベントの間中維持される.WSTPServer`SetKeepAliveは現在のブリッジという点でKeepAlive設定ファイル鍵をオーバーライドする.
Wolfram言語関数:WSTPServer`SetReserveKernel
WSTPServer`SetReserveKernel[setting]は,ブール値 setting に従って,現在のカーネルがアンブリッジされたときに,IDでリクエストするクライアントにのみブリッジできるかどうかを設定する.
現在の接続がブリッジされていない場合,または現在の接続にブリッジされているカーネルがプールの一部ではない場合,WSTPServer`SetReserveKernelは失敗となる.WSTPServer`SetReserveKernelのカーネルへの効果は将来のブリッジイベントにまで持続する.WSTPServer`SetReserveKernelはカーネルの設定ファイルのReservePreviouslyConnectedKernels鍵をオーバーライドする.
Wolfram言語関数:WSTPServer`StartKernel
WSTPServerのコマンドラインオプションには以下がある:
-h, --help | ヘルプのテキストを出力する | |
-l, --log-level n | メッセージの冗長性のレベルを指定する | |
-f, --log-file [file] | 指定されたファイルにメッセージを書き込む | |
-a, --advertise [service] | 存在する場合は,指定されたサービスとしてリンクサーバをアドバタイズする | |
-p, --port port | 指定されたポートでリスンする | |
-i, --interface interface | 指定されたインターフェースでリスンする | |
-c, --configuration-file file | 指定された設定ファイルを使う |
error, 1 | サーバの起動/終了エラーを報告し,起動成功のメッセージを出力する | |
debug, 2 | レベル1のすべての他,デバッグのメッセージをすべて報告する | |
trace, 3 | レベル2のすべての他,扱われたWSTPのトラヒックすべてを報告する |
--advertise [service]
または-a [service]
が使われると,serviceが指定されているかどうかに従ってWSTPServerは自身をWSTPServer-Instance
またはWSTPServer-Instance-service
としてアドバタイズしようと試みる.WSTPServerはアドバタイズしているサービス名のログを記録する.--interfaceまたは-iが使われない場合,リンクサーバはデフォルトのネットワークインターフェースでリスンする.インターフェースをlocalhostに設定すると,ローカルネットワーク上でWSTPServerが見えなくなる.
並列計算機能の利用
WSTPServerはWolfram言語の並列計算機能で使用できるように,並列カーネルのプールを管理することができる.
以下の手順はフロントエンドでWSTPServerを使って並列計算機能を利用する方法を示したものである:
# wstpserver.conf: place in the current working directory
{
"Pools":
{
"IProvideParallelKernels":
{
"Parallel":true,
"MinimumKernelNumber":4
}
}
}
3. AppendToConfiguredKernels["port@hostname", num]を使って,WSTPServer並列カーネルを並列計算機能に加える.第1引数は接続するWSTPServerのポートとホスト名(オプショナル)である.第2引数は利用するWSTPServer並列カーネルの数である.
特別に設定されたプールへのブリッジ
WSTPServerは特別な目的(共有の初期化ファイルを使う等)のためのプールを設定することができる.それがデフォルトのプールではない場合,特別なプールを使用するためにコマンド言語を使う必要がある.Wolfram言語関数WSTPServer`ConnectKernelおよびWSTPコマンドConnectKernelを使ってプールにブリッジすることができる.
以下の手順は,特別に設定されたプールにWolframScriptを使ってブリッジする方法を示したものである:
# wstpserver.conf: place in the current working directory
{
"Pools":
{
"IDefineX":
{
"InitializationCode":"x=4"
}
}
}
2. コンソールを使ってwolframscript -wstpserver -startprofileを実行する.WSTPServerが見付からない場合は-wstpserver wstpserverbase オプションを使う.
3. WolframScript REPL内でWSTPServer`GetPoolName[]を使って,現在ブリッジされているカーネルのプールをオプショナルで調べることができる.プールの初期化コードが与えられると,xは評価すると想定通り4になる.
$ wolframscript -wstpserver -kernelpool AlternativeThree
In[1]:= WSTPServer`GetPoolName[]
Out[1]= IDefineX
In[2]:= x
Out[2]= 4
In[3]:=
前に使用したカーネルへのブリッジ
状態を構築した後に前に使ったカーネルに戻ると便利なことがある.通常これには,設定ファイル鍵KeepAliveを使ってカーネルを永続的に有効にしておくようWSTPServerを設定する必要がある.Wolfram言語関数WSTPServer`ConnectKernel またはWSTPコマンドConnectKernelが必要である.
次の手順は,カーネルで状態を積み上げWolframScriptを使ってそのカーネルに戻る方法を示したものである:
# wstpserver.conf: place in the current working directory
{
"Pools":
{
"IBuildUpState":
{
"KeepAlive":true
}
}
}
2. コンソールを使って,wolframscript -wstpserver -startprofileを実行する.WSTPServerが見付からない場合は-wstpserver wstpserverbase オプションを使う.
3. WolframScript REPL内でWSTPServer`GetKernelID[]を使って現行のカーネルIDのIDを取得する.この結果は重要である.これで後で現行のカーネルに戻れるからである.
$ wolframscript -wstpserver -startprofile
In[1]:= WSTPServer`GetKernelID[]
Out[1]= a806-2645-9651
In[2]:=
In[10]:= WSTPServer`DisconnectKernel[]
$
7. オプショナルで,WSTPServer`GetKernelID[]で現在ブリッジされているカーネルのIDを調べることができる.
$ wolframscript -wstpserver -continueprofile
In[11]:= WSTPServer`GetKernelID[]
Out[11]= a806-2645-9651
In[12]:=
WolframScriptプロファイルシステムの使用
WolframScriptはWSTPServerカーネルへの再接続を簡単にすることができる.指定されたカーネルへの接続は,ユーザが管理しなければならないプロファイルファイルで追跡することをお勧めする.WolframScriptは使用されているカーネルへの再接続を可能にするために,そのカーネルのIDをプロファイルファイルに記録する.
プログラムページ「WolframScript」のセクション「詳細」ではプロファイルシステムの他,オプション-wstpserver,-startprofile,-continueprofileについて詳しく説明している.セクション「オプション」ではWolframScriptのコマンドラインオプションの便利な高レベルの概要を述べている.
次の手順は,WolframScriptを使って指定された特性を持つカーネルとブリッジする方法を示したものである:
# wstpserver.conf: place in the current working directory
{
"Pools":
{
"IHaveSpecificProperties":
{
"KeepAlive":true,
"ReservePreviouslyConnectedKernels":false
}
}
}
2. WSTPServerカーネルの希望の特性を含むプロファイルファイルを作成する.
# sampleprofile
KEEPALIVE=TRUE # I want a kernel with "KeepAlive" set to true
RESERVE=TRUE # I want a kernel with "ReservePreviouslyConnectedKernels" set to false
3. コンソールを使って,wolframscript -wstpserver -startprofile sampleprofileを実行する.WSTPServerが見付からない場合は,-wstpserver wstpserverbase オプションを使う.
$ wolframscript -wstpserver -startprofile sampleprofile
In[1]:=
4. WolframScript REPL内で定義を作成し,状態を積み上げる.
In[1]:= x = 2 + 2
Out[1]:= 4
In[10]:= WSTPServer`DisconnectKernel[]
$
$ wolframscript -wstpserver -continueprofile sampleprofile
In[11]:= x
Out[11]:= 4
設定に反して,WSTPServerから接続解除された後でもカーネルを有効にしておく
通常,WSTPServerから接続解除されたカーネルを有効にしておくためには,設定ファイル鍵KeepAliveをtrueにして WSTPServerを設定する必要がある.しかしWolfram言語関数WSTPServer`SetKeepAliveおよびWSTPコマンドSetKeepAliveは現在ブリッジされているカーネルを永続的に有効にしておくことができる.
1. WSTPServerサーバ設定を使ってノートブックを作成する.
2. ノートブック内でWSTPServer`GetKernelID[]を使って現行のカーネルのIDを取得する.この結果は重要である.これを使って,後で現行のカーネルに戻ることができる.
4. カーネルに戻るためには,wolframscript -wstpserver -continueprofileを実行する.WSTPServerが見付からない場合は,-wstpserver port@hostオプションを使う.
$ wolframscript -wstpserver -continueprofile
In[11]:= WSTPServer`GetKernelID[]
Out[11]= 825c-6cbd-129b
In[12]:=
重要な作業をしているカーネルの確保
現行のカーネルがアンブリッジされたときに,そのカーネルのIDでリクエストするクライアントとのブリッジだけを許可すると便利なことがある.こうすることで,その特定のカーネルを必要とするユーザにだけ利用でき,そのカーネルを必要としないユーザから現行カーネルのセッションを保護することができる.これは設定ファイル鍵ReservePreviouslyConnectedKernelsがtrueのときのデフォルトの動作である.
Wolfram言語関数WSTPServer`SetReserveKernelまたはWSTPコマンドSetReserveKernelを使うと,ReservePreviouslyConnectedKernelsの値に関わらず現行カーネルを確保することができる.次の手順は,WSTPServer`SetReserveKernelとフロントエンドを使って,カーネルを確保し安全にカーネルからアンブリッジする方法を示したものである:
1. WSTPServerカーネル設定を使ってノートブックを作成する.
2. ノートブック内でWSTPServer`SetReserveKernel[True]を使ってカーネルを確保する.
WSTPServerの監視
WSTPServerはサーバプログラムなので,その現行の状態をチェックして診断的な情報を得ることが役に立つことがある.このためにはWolfram言語関数WSTPServer`GetServerInformationまたはWSTPコマンドGetServerInformationが使える.
以下の手順は,フロントエンドを使ってWSTPServerの現行の状態についての情報を得る方法を示したものである:
1. WSTPServerカーネル設定を使ってノートブックを作成する.