WSTPServer入門

WSTPServerは,WSTPの着信接続についてWolfram言語カーネルを起動および管理するサーバプログラムである.これはWSTPの単独のエンドポイントでリスンし,任意の数のクライアントがカーネルを取得するために既知の場所に接続することを許可する.
これは,管理するカーネルへのすべてのトラフィックを転送し,WSTPServerへのリンクがあたかもカーネルへの直接のリンクであるかのように動作することを可能にする.カーネルは,カーネルプールを使うことで特定の特性で設定することができる.WSTPServerカーネルに接続したり,その接続を解除したり,再接続したりすることができるため,別のプログラムやマシンから接続できる,長時間利用可能なセッションを維持することができる.最も簡単なレベルでは,WSTPServerは新しいカーネルが必要なときに起動するより一般的な方法に代る,起動済みで設定済みのWolfram言語カーネルのプロバイダと考えることができる.
WSTPServerの起動
WSTPServerはサーバプログラムであり,これに接続するためには実行中でなければならない.
macOSではTerminalで以下を実行して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

...
Windowsではcmd.exeで以下を実行してWSTPServerを起動する:
$ "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等)の場合は,パスを適切なものに変更する必要がある.
ターミナルがコマンドラインに戻ったら,WSTPServerが修正できない問題のために終了してしまったということであり接続することはできない.WSTPServerは終了した理由をターミナルに記録する.
WSTPServerlaunchdsystemd,Windows Services Manager等のサービス管理システムで実行することもできる.
永続的なカーネル
Wolfram言語のカーネルは通常ユーザとの接続により制限される.接続がなくなると関連したカーネルもなくなり,進行中の作業が中断される.しかしWSTPServerを使うと,カーネルを失ったり作業を中断することなくカーネルから接続を解除し,後で同じカーネルに再接続することができる.
WSTPServerでカーネルに接続することの利点は,ファイルをロードし,定義を作成し,式を評価する等して状態を積み上げてからでも,後でそのカーネルに別のマシンからでも再接続できるようにカーネルを有効なままにしておくことができる点である.この例はセクション「以前使ったカーネルにブリッジする」に挙げる.
別の利点として,WSTPServerはネットワーク接続の中断によるカーネルの停止を阻止することができるため,カーネルの作業が継続できるというものがある.ネットワーク上の接続は不安定になり維持できなくなる場合がある.中断されたカーネルに戻るためには,WSTPServerに再接続し,中断したカーネルへの接続を確立するだけでよい.
最後の例は実行時間の長い計算に関連したものである.ユーザはWSTPServerで管理されるカーネルで長い計算を開始し,終了が予定されているときにカーネルに戻り結果を得ることができる.最初のカーネルがビジーのときは,WSTPServerで管理される別のカーネルに接続してタスクを実行することもできる.
カーネルはすべて,そのカーネルに接続するために使うことのできるカーネルIDを持つ.このIDはそのカーネル内でWSTPServer`GetKernelID[]を評価するかWSTPコマンドGetKernelIDを使うかして取得することができる.
このドキュメントでは「ブリッジ」という言葉をよく使う.WSTPServerは仲介者のような働きをし,クライアントとカーネルとの間の通信を往来させる.ブリッジとはWSTPServerがクライアントとカーネルの間に確立した接続のことである.「アンブリッジ」とはクライアントとカーネルの間の接続を終了することである.それでもクライアントは別のカーネルにブリッジすることができる.
特定のカーネルへの接続に関する詳細は,Wolfram言語関数WSTPServer`ConnectKernelおよびWSTPコマンドConnectKernelの説明を参照のこと.
カーネルプール
カーネルプールとは,初期化コード等のユーザ設定の特性を共有するカーネルのグループのことである.WSTPServerで管理されるカーネルのほとんどは,このようなプールのメンバであると想定されており,少なくとも1つのカーネルプールがデフォルトのプールとして設定されなくてはならない.デフォルトプールのカーネルは,特定のカーネルあるいはプールを要求しない接続に提供される.複数のカーネルプールを設定することで,さまざまな用途に対して事前に初期化された別々のカーネル集合を使うことができる.
デフォルトプールおよびカーネルプール一般についての設定処理に関する詳細は,「設定ファイル」を参照のこと.特定のカーネルへの接続については,Wolfram言語関数WSTPServer`ConnectKernelおよびWSTPコマンドConnectKernelを参照されたい.セクション「特別に設定されたプールへのブリッジ」には,特定のカーネルプールへのブリッジでWSTPServer`ConnectKernelを使う方法を解説した例がある.
さまざまなクライアントでの使用
Wolframシステムのほとんどでは,カーネルとの通信にWSTPを利用している.したがってWSTPServerはWolframシステムの多くのコンポーネントと簡単に統合することができる.
このセクションでは,広く使われるそのようなコンポーネントの多くとWSTPServerを使うことについて説明する.

WolframScriptとの使用

WolframScriptはWolfram言語のコード,関数,配備されたAPIを実行することができる,Wolfram言語のためのコマンドラインスクリプトインタプリタである.WolframScriptWSTPServerに接続しそのカーネルとインタラクトすることもできる.
次の例では,WolframScriptWSTPServerカーネルでコードを評価する:
$ wolframscript -wstpserver -code "StringReverse[\"hello\"]"
olleh
WolframScriptでは,WSTPServerカーネルに簡単に再接続することができる.これを安全に行うためには,ユーザが管理しなければならないファイルシステム上の profiles で特定のカーネルへの接続を追跡することをお勧めする.WolframScriptは,カーネルへの再接続を許可するために,使用されているカーネルのIDをプロファイルファイルに記録する.
WSTPServerカーネルへの再接続を許可するプロファイルファイルを使うためには,-startprofileオプションを使う:
-continueprofileを使うと同じカーネルに再接続し,xの値を取り出すことができる.
特定のWSTPServerに接続するために-wstpserverを使うこともできる.この例では,ポート31416でリスンするローカルマシン上で起動するWSTPServerに接続する.
WSTPServerなしでWolframScriptを使う場合は,計算の度に新しいカーネルを使わなければならない.-startprofileおよび-continueprofileWSTPServerを使うと,複数のWolframScriptの計算すべてで同じカーネルを使ったセッションを維持することができる.
プログラムページ「WolframScript」「詳細」にはプロファイルシステムおよびオプション-wstpserver-startprofile-continueprofileについての詳しい説明が書いてある.セクション「オプション」では,WolframScriptのコマンドラインオプションの高レベルな概要を見ることができる.

ノートブックインターフェースとの使用

以下ではノートブックフロントエンドとWSTPServerの接続方法およびそのカーネルとインタラクトする方法を説明する:
1. ローカルマシンでフロントエンドを開始する.ツールバーで評価 カーネル環境設定...を選ぶ.
2. 新しいカーネルを追加し,設定する.ダイアログで追加をクリックすると「カーネル環境設定」ダイアログが現れる.
3. カーネルに適した名前(例:WSTPServerKernel)を入力する.
4. 「詳細設定」を選ぶ.「MLOpenの引数」というフィールドに以下のように入力する.ここで「port」と「host」(オプショナル)はそれぞれWSTPServerがリスンしているポートとホストに置き換える.
5. OKをクリックして新規ノートブックを開く.
6. ツールバーで評価 ノートブック用カーネルを選び,作成したばかりのカーネル名を選ぶ.
7. ノートブック内で,WSTPServerによって管理されているカーネルでコマンド(例:2+2WSTPServer`GetKernelID[])を評価して想定通りの結果が出ることを確認する.
WSTPServerとノートブックインターフェースを使うことに関する例は,「付録:例」セクションに記載されている.

並列計算での使用

Wolfram言語は,並列計算のためのパワフルでユニークな環境を提供する.通常,機能のほとんどは最小限の努力で使うことができ,並列システムの低レベルの内部構造にそれほど注目する必要はない.
WSTPServerは並列計算機能で使用するために,並列カーネルプールを管理することができる.並列計算機能には,WSTPServer並列カーネルに接続するために追加の設定が必要である.セクション「並列計算機能の利用」には,フロントエンドを使うときのこのプロセスを説明する例題が提供されている.
WSTPServerに関連するセクション「設定するカーネルのタイプ」は,並列計算機能を持つインターフェースについて詳しく説明している.

WSTPのCバインディングとの使用

上記のクライアントはすべてWSTPを利用しているが,その低レベルの詳細のほとんどは隠している.WSTPWSTPの完全パワーを直接使いたい開発者のために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;
}
設定ファイル
WSTPServerの動作は主にwstpserver.conf設定ファイルを介して制御される.
設定ファイルはまず現在の作業ディレクトリで検索され,次に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を送るかどうか
Poolsには少なくとも1つの名前付きのカーネルプールが必要であるが,それが含むことのできる鍵-値ペアはオプショナルでありデフォルト値を持つ.
AllowStealingKernelstrueに設定されていると,コンピュータを別のものに替えても,もとのコンピュータでカーネルからアンブリッジすることなく,同じカーネルセッションを維持することができる.
AllowSilentKernelReplacementtrueに設定されていると,WSTPServer自身が閉じたカーネル(例:KeepAliveフラグがfalseに設定されていたため,等)は代替されない.AllowSilentKernelReplacementfalseの場合,ブリッジされたカーネルが失われると,そのカーネルにブリッジされていたクライアントリンクは閉じる.
EnableAutomaticKernelConnectiontrueに設定されていると,クライアントリンクが構築されるとすぐにそれにブリッジされる.カーネルが必要とされる前に準備されることになるため,クライアントリンクを使った最初の評価にかかる時間を短縮することができる.
WSTPServerPools内のカーネルプールについて以下の鍵を認識する:
Default
automatic
新しいクライアントに対してこのプールをデフォルトとして使うかどうか
InitializationCode
""
プール内のカーネルについて実行する初期化コード
InitializationFile
""
プール内のカーネルについて実行する初期化ファイル
KernelPath
automatic
プール内のカーネルが実行するWolfram言語カーネルの実行ファイルへのパス
KernelOptions
""
プール内のカーネルが実行するWolfram言語カーネルの実行ファイルに対する追加のコマンドラインオプション
KeepAlive
true
カーネルを無限に有効なままにしておくか,アンブリッジされたときに閉じるか
MaximumKernelNumber
automatic
プールが含むことのできる実行中のカーネルの最大数
MinimumKernelNumber
2
プールが常に含むことのできる実行中のカーネルの最小数
ParallelKernelDefault
automatic
並列計算のときにこのプールをデフォルトとして使うかどうか
ParallelKernels
false
プールのカーネルを並列計算用に設定するかどうか
ReservePreviouslyConnectedKernels
true
以前ブリッジされたカーネルが,IDで要求するクライアントとだけ再びブリッジできるかどうか
Defaultのautomaticの値は,最初のカーネルプールオブジェクトについてはtrueである.
ParallelKernelDefaultのautomaticの値は,ParallelKernelstrueに設定された最初のプールオブジェクトについてはtrueである.
KernelPathのautomaticの値は自己検出された文字列であるが,この自己検出は失敗する可能性がある.失敗した場合はKernelPathが必要になる.
MaximumKernelNumberのautomaticの値は,MinimumKernelNumberの値が0より大きいときはその値,そうでないときは2である.
WSTPServerは起動時に,MinimumKernelNumberの値に等しい数のカーネルを事前に起動する.これらのカーネルは設定ファイルの鍵InitializationCodeまたはInitializationFileでウォームアップすることができる.
KeepAlivetrueに設定されていると,クライアントが接続を解除してもカーネルは閉じないので,同じクライアントと再び接続することも別のクライアントと接続することもできる.クライアントはQuitまたはExitはなくWolfram言語関数WSTPServer`DisconnectKernelWSTPコマンドDisconnectKernelを使うように気を付けなければならない.前者を使うとカーネルは終了してしまう.
ReservePreviouslyConnectedKernelsfalseの場合,以前にブリッジされたカーネルがあると,アンブリッジされた順に選ばれる.
コマンド言語
WSTPServerはコマンドを使って動的に制御することができる.コマンドはWSCommandPacketと呼ばれる特別なラッパーでWSTPを介して直接WSTPServerに送られる.これらのコマンドの結果はReturnPacketパケットで送り返される.WSCommandPacket機能はWSTPServerを使って自分自身のWSTPプログラムを書く開発者向けである.WSCommandPacketの例は「WSTPのCバインディングとの使用」に挙げてある.
コマンドパケットの構造は以下でなければならない:
WSCommandPacket[command[arguments]]
コマンドパケットへの戻りパケットの構造は以下である:
ReturnPacket[returnvalue]
送られたコマンドパケットが正しい構造ではなかった場合はReturnPacket["{\"status\":\"PacketMalformed\"}"]が返される.
コマンドパケットで想定される可能なコマンドは以下の通りである:
CloseKernel
指定されたカーネルを閉じる
ConnectKernel
指定されたカーネルとの現行の接続をブリッジする
ConnectParallelKernel
並列カーネルのデフォルトプールで利用可能な最初のカーネルとの現行の接続をブリッジする
DisconnectKernel
ブリッジされたカーネルとの現行の接続をアンブリッジする
GetKernelBusyStatus
現行の接続にブリッジされたカーネルが評価で忙しいかどうかを知らせる
GetKernelID
現行の接続にブリッジされたカーネルのIDを取得する
GetNumberOfAvailableParallelKernels
並列カーネルのデフォルトプルーフで利用可能なカーネル数を取得する
GetPoolName
現行の接続にブリッジされたカーネルのプールの名前を取得する
GetServerInformation
すべてのプールおよびカーネルの情報を得る
SetAllowSilentKernelReplacement
現行の接続にブリッジされたカーネルが失われた場合に,通知なしでそのカーネルの代替を許可するかどうかを設定する
SetKeepAlive
現行の接続が切れたりブリッジが終了したりした場合に,現行の接続にブリッジされたカーネルを閉じるかどうかを設定する
SetReserveKernel
現行のカーネルがアンブリッジされたときに,そのカーネルをIDでリクエストするクライアントにのみブリッジすることができるかどうかを設定する
StartKernel
プール外部のカーネルを開始し,そのIDを返す
次のサブセクションではこれらのWSTPコマンドについて詳しく説明する.

WSTPコマンド:CloseKernel

WSCommandPacket[CloseKernel["id"]]はIDが id のカーネルを閉じる.
成功すると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

WSCommandPacket[DisconnectKernel[]]はブリッジされたカーネルとの現在の接続をアンブリッジする.
現在の接続がブリッジされてない場合,DisconnectKernelは失敗となる.
成功すると ReturnPacket["{\"status\":\"ExecutionSuccess\"}"] が返され,失敗すると ReturnPacket["{\"status\":\"ExecutionError\"}"] が返される.

WSTPコマンド:GetKernelBusyStatus

WSCommandPacket[GetKernelBusyStatus[]]は,現在の接続にブリッジされたカーネルが評価で忙しいかどうかを知らせる.この関数は,現在の接続がブリッジされていない場合は失敗となる.
WSCommandPacket[GetKernelBusyStatus["id"]]はIDが id のカーネルが評価で忙しいかどうかを知らせる.
成功するとReturnPacket["{\"result\":\"True\"}"]またはReturnPacket["{\"result\":\"False\"}"]が返され,失敗するとReturnPacket["{\"status\":\"ExecutionError\"}"]が返される.

WSTPコマンド:GetKernelID

WSCommandPacket[GetKernelID[]]現在の接続にブリッジされているカーネルのIDを取得する.
現在の接続がブリッジされていない場合,GetKernelIDは失敗となる.
成功すると ReturnPacket["{\"result\":\" id \"}"] が返され,失敗すると ReturnPacket["{\"status\":\"ExecutionError\"}"] が返される.

WSTPコマンド:GetNumberOfAvailableParallelKernels

WSCommandPacket[GetNumberOfAvailableParallelKernels[]] は並列カーネルのデフォルトプールで利用可能なカーネルの数を取得する.
成功するとReturnPacket["{\"result\":\"num\"}"]が返され,失敗するとReturnPacket["{\"status\":\"ExecutionError\"}"]が返される.num の値は並列カーネルのデフォルトプールで利用できるカーネル数である.

WSTPコマンド:GetPoolName

WSCommandPacket[GetPoolName[]] は現行の接続にブリッジされているカーネルプールの名前を取得する.
現行の接続がブリッジされていない場合,またはカーネルがプールの一部ではない場合,GetPoolNameは失敗となる.
成功すると ReturnPacket["{\"result\":\" name \"}"] が返され,失敗すると ReturnPacket["{\"status\":\"ExecutionError\"}"] が返される.

WSTPコマンド:GetServerInformation

WSCommandPacket[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 の値はTrueFalseである.
現在の接続がブリッジされていない場合,SetAllowSilentKernelReplacementは失敗となる.SetAllowSilentKernelReplacementは現在のブリッジという点で,AllowSilentKernelReplacement設定ファイル鍵をオーバーライドする.
成功するとReturnPacket["{\"status\":\"ExecutionSuccess\"}"]が返され,失敗するとReturnPacket["{\"status\":\"ExecutionError\"}"]が返される.

WSTPコマンド:SetKeepAlive

WSCommandPacket[SetKeepAlive[setting]]は,現在の接続が失われたりブリッジが終了したりした場合に,現在の接続にブリッジされているカーネルを閉じるかどうかをWSTPServerに指示する.setting の値はTrueFalseである.
現在の接続がブリッジされていない場合,SetKeepAliveは失敗となる.SetKeepAliveは現在のブリッジという点でKeepAlive設定ファイル鍵をオーバーライドする.
成功すると ReturnPacket["{\"status\":\"ExecutionSuccess\"}"] が返され,失敗すると ReturnPacket["{\"status\":\"ExecutionError\"}"] が返される.

WSTPコマンド:SetReserveKernel

WSCommandPacket[SetReserveKernel[setting]]は,現在のカーネルがアンブリッジされたときに,IDでリクエストするクライアントにのみブリッジできるかどうかを設定する.setting の値はTrueFalseでなければならない.
現在の接続がブリッジされていない場合,またはカーネルがプールの一部ではない場合,SetReserveKernelは失敗となる.SetReserveKernelのカーネルへの効果はブリッジイベントにまで持続する.SetReserveKernelはブリッジに関してReservePreviouslyConnectedKernels設定ファイル鍵をオーバーライドする.
成功すると ReturnPacket["{\"status\":\"ExecutionSuccess\"}"] が返され,失敗すると ReturnPacket["{\"status\":\"ExecutionError\"}"] が返される.

WSTPコマンド:StartKernel

WSCommandPacket[StartKernel[]]はカーネル(プール外)を開始し,そのIDを返す.
WSCommandPacket[StartKernel["commandLine"]]commandLine でカーネル(プール外)を開始し,そのIDを返す.
成功すると ReturnPacket["{\"result\":\" id \"}"] が返され,失敗すると ReturnPacket["{\"status\":\"ExecutionError\"}"] が返される.
Wolfram言語関数
前のセクションではWSCommandPacketパケットを使ってWSTPServerを制御する低レベルの方法を説明した.Wolfram言語関数にも,WSTPServerカーネルがWSTPServerにアクセスしそれを制御することを可能にするものがある.
Wolfram言語のコマンドには次がある:
WSTPServer`CloseKernel
指定されたカーネルを閉じる
WSTPServer`ConnectKernel
指定されたカーネルとの現行の接続をブリッジする
WSTPServer`DisconnectKernel
ブリッジされたカーネルとの現行の接続をアンブリッジする
WSTPServer`GetKernelID
現行の接続にブリッジされたカーネルのIDを取得する
WSTPServer`GetPoolName
現行の接続にブリッジされたカーネルのプールの名前を取得する
WSTPServer`GetServerInformation
すべてのプールおよびカーネルの情報を得る
WSTPServer`SetAllowSilentKernelReplacement
現行の接続にブリッジされたカーネルが失われた場合に,通知なしでそのカーネルの代替を許可するかどうかを設定する
WSTPServer`SetKeepAlive
現行の接続が切れたりブリッジが終了したりした場合に,現行の接続にブリッジされたカーネルを閉じるかどうかを設定する
WSTPServer`SetReserveKernel
現行のカーネルがアンブリッジされたときに,そのカーネルをIDでリクエストするクライアントにのみブリッジすることができるかどうかを設定する
WSTPServer`StartKernel
プール外部のカーネルを開始し,そのIDを返す
以下のサブセクションではこれらのWolfram言語関数すべてについての詳細を説明する.

Wolfram言語関数:WSTPServer`CloseKernel

WSTPServer`CloseKernel["id"]はIDが id のカーネルを閉じる.
成功すると成功オブジェクトが返され,失敗すると失敗オブジェクトが返される.

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

WSTPServer`DisconnectKernel[] はブリッジされたカーネルとの現在の接続をアンブリッジする.
現在の接続がブリッジされてない場合,WSTPServer`DisconnectKernelは失敗となる.
成功すると成功オブジェクトが返され,失敗すると失敗オブジェクトが返される.

Wolfram言語関数:WSTPServer`GetKernelID

WSTPServer`GetKernelID[]現在の接続にブリッジされているカーネルのIDを取得する.
現在の接続がブリッジされていない場合,WSTPServer`GetKernelIDは失敗となる.
成功すると"id"が返され,失敗すると失敗オブジェクトが返される.

Wolfram言語関数:WSTPServer`GetPoolName

WSTPServer`GetPoolName[] は現行の接続にブリッジされているカーネルのプールの名前を取得する.
現行の接続がブリッジされていない場合,またはカーネルがプールの一部ではない場合,WSTPServer`GetPoolNameは失敗となる.
成功すると"name"が返され,失敗すると失敗オブジェクトが返される.

Wolfram言語関数:WSTPServer`GetServerInformation

WSTPServer`GetServerInformation[] はすべてのプールおよびカーネルに関する情報を取得する.
成功すると,セクション「WSTPServerの監視」に記載のJSONスキーマに類似したAssociationが返され,失敗すると失敗オブジェクトが返される.
WSTPServerの監視について,同様のWolfram言語関数WSTPServer`GetServerInformationの使用法を説明する例がセクション「WSTPServer`SetAllowSilentKernelReplacement」に挙げてある.

Wolfram言語関数:WSTPServer`SetAllowSilentKernelReplacement

WSTPServer`SetAllowSilentKernelReplacement[setting]は,カーネルが失われたときに,現行の接続にブリッジされているカーネルのサイレントの再起動を許可するかどうかを設定する.setting の値はTrueFalseである.
現在の接続がブリッジされていない場合,WSTPServer`SetAllowSilentKernelReplacementは失敗となる.WSTPServer`SetAllowSilentKernelReplacementは現在のブリッジという点で,AllowSilentKernelReplacement設定ファイル鍵をオーバーライドする.
成功すると成功オブジェクトが返され,失敗すると失敗オブジェクトが返される.

Wolfram言語関数:WSTPServer`SetKeepAlive

WSTPServer`SetKeepAlive[setting] は,現在のカーネルがアンブリッジされた場合に,そのカーネルのIDでリクエストするクライアントだけにカーネルをブリッジするかどうかを設定する.setting の値はTrueFalseである.
現在の接続がブリッジされていない場合,またはカーネルがプールの一部ではない場合,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`StartKernel[]はカーネル(プール外)を開始し,そのIDを返す.
WSTPServer`StartKernel["commandLine"]commandLine でカーネル(プール外)を開始し,そのIDを返す.
成功すると"id"が返され,失敗すると失敗オブジェクトが返される.
付録:コマンドラインオプション
WSTPServerのコマンドラインオプションには以下がある:
-h, --help
ヘルプのテキストを出力する
-l, --log-level n
メッセージの冗長性のレベルを指定する
-f, --log-file [file]
指定されたファイルにメッセージを書き込む
-a, --advertise [service]
存在する場合は,指定されたサービスとしてリンクサーバをアドバタイズする
-p, --port port
指定されたポートでリスンする
-i, --interface interface
指定されたインターフェースでリスンする
-c, --configuration-file file
指定された設定ファイルを使う
--log-levelおよび-lの3つの冗長性レベルは以下の通りである:
error, 1
サーバの起動/終了エラーを報告し,起動成功のメッセージを出力する
debug, 2
レベル1のすべての他,デバッグのメッセージをすべて報告する
trace, 3
レベル2のすべての他,扱われたWSTPのトラヒックすべてを報告する
--log-levelまたは-lが使われない場合,デフォルトのログの冗長性はerrorに設定される.
--log-fileまたは-fが使われない場合やファイルを指定しないで使われた場合は,メッセージはstdoutに書き込まれる.
--advertise [service]
または
-a [service]
が使われると,serviceが指定されているかどうかに従ってWSTPServerは自身を
WSTPServer-Instance
または
WSTPServer-Instance-service
としてアドバタイズしようと試みる.WSTPServerはアドバタイズしているサービス名のログを記録する.
--advertiseまたは-aが使われない場合,リンクサーバはアドバタイズされない.
--portまたは-pが使われない場合,リンクサーバはポート31415でリスンする.
--interfaceまたは-iが使われない場合,リンクサーバはデフォルトのネットワークインターフェースでリスンする.インターフェースをlocalhostに設定すると,ローカルネットワーク上でWSTPServerが見えなくなる.
--configuration-fileまたは-cが使われない場合,リンクサーバはデフォルトの設定ファイル検索動作および使用法を使う.
付録:さまざまな例

並列計算機能の利用

WSTPServerはWolfram言語の並列計算機能で使用できるように,並列カーネルのプールを管理することができる.
以下の手順はフロントエンドでWSTPServerを使って並列計算機能を利用する方法を示したものである:
1. wstpserver.conf設定ファイルを使って,並列カーネルを確実に設定する:
# wstpserver.conf: place in the current working directory
{
    "Pools":
        {
            "IProvideParallelKernels":
                {
                    "Parallel":true,
                    "MinimumKernelNumber":4
                }
        }
}
2. ノートブック内でNeeds["WSTPServerTools`"]を評価する.
3. AppendToConfiguredKernels["port@hostname", num]を使って,WSTPServer並列カーネルを並列計算機能に加える.第1引数は接続するWSTPServerのポートとホスト名(オプショナル)である.第2引数は利用するWSTPServer並列カーネルの数である.
4. 並列計算機能を使うコードを実行する(例:ParallelSum[EulerPhi[i], {i, 10^6}]).
5. オプショナルで,Kernels[]を使ってステップ3で設定されたWSTPServer並列カーネルに接続されていることを調べることができる.

特別に設定されたプールへのブリッジ

WSTPServerは特別な目的(共有の初期化ファイルを使う等)のためのプールを設定することができる.それがデフォルトのプールではない場合,特別なプールを使用するためにコマンド言語を使う必要がある.Wolfram言語関数WSTPServer`ConnectKernelおよびWSTPコマンドConnectKernelを使ってプールにブリッジすることができる.
以下の手順は,特別に設定されたプールにWolframScriptを使ってブリッジする方法を示したものである:
1. wstpserver.conf設定ファイルを使って確実にプールを設定する.
# 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を使ってそのカーネルに戻る方法を示したものである:
1. wstpserver.conf設定ファイルを使って,カーネルが永続的に有効になるよう確実に設定する.
# 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]:=
4. 定義を作成し状態を積み上げる.
5. WSTPServer`DisconnectKernel[]を使ってWSTPServerから安全にアンブリッジおよび接続解除する.
In[10]:= WSTPServer`DisconnectKernel[]
$
6. ステップ2で取得したカーネルに戻るためには,wolframscript -wstpserver -continueprofileを実行する.
7. オプショナルで,WSTPServer`GetKernelID[]で現在ブリッジされているカーネルのIDを調べることができる.
$ wolframscript -wstpserver -continueprofile

In[11]:= WSTPServer`GetKernelID[]

Out[11]= a806-2645-9651

In[12]:=

WolframScriptプロファイルシステムの使用

WolframScriptWSTPServerカーネルへの再接続を簡単にすることができる.指定されたカーネルへの接続は,ユーザが管理しなければならないプロファイルファイルで追跡することをお勧めする.WolframScriptは使用されているカーネルへの再接続を可能にするために,そのカーネルのIDをプロファイルファイルに記録する.
プログラムページ「WolframScript」のセクション「詳細」ではプロファイルシステムの他,オプション-wstpserver-startprofile-continueprofileについて詳しく説明している.セクション「オプション」ではWolframScriptのコマンドラインオプションの便利な高レベルの概要を述べている.
次の手順は,WolframScriptを使って指定された特性を持つカーネルとブリッジする方法を示したものである:
1. wstpserver.conf設定ファイルを使って,希望の特性を持つカーネルを確実に設定する.
# 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
5. WSTPServer`DisconnectKernel[]を使ってWSTPServerから安全にアンブリッジおよび接続解除する.
In[10]:= WSTPServer`DisconnectKernel[]
$
6. ステップ3で取得したカーネルに戻るためには,wolframscript -wstpserver -continueprofile sampleprofileを実行する.
$ wolframscript -wstpserver -continueprofile sampleprofile

In[11]:= x

Out[11]:= 4

設定に反して,WSTPServerから接続解除された後でもカーネルを有効にしておく

通常,WSTPServerから接続解除されたカーネルを有効にしておくためには,設定ファイル鍵KeepAlivetrueにして WSTPServerを設定する必要がある.しかしWolfram言語関数WSTPServer`SetKeepAliveおよびWSTPコマンドSetKeepAliveは現在ブリッジされているカーネルを永続的に有効にしておくことができる.
次の手順は,アンブリッジの後でもWSTPServer`SetKeepAliveを使ってカーネルを有効にし,WolframScriptを使ってそのカーネルに戻る方法を示したものである:
1. WSTPServerサーバ設定を使ってノートブックを作成する.
2. ノートブック内でWSTPServer`GetKernelID[]を使って現行のカーネルのIDを取得する.この結果は重要である.これを使って,後で現行のカーネルに戻ることができる.
3. WSTPServer`DisconnectKernel[]を使って,WSTPServerから安全にアンブリッジおよび接続解除する.
4. カーネルに戻るためには,wolframscript -wstpserver -continueprofileを実行する.WSTPServerが見付からない場合は,-wstpserver port@hostオプションを使う.
5. WolframScript REPL内で,オプショナルでWSTPServer`GetKernelID[]を使って現在ブリッジされているカーネルのIDを調べることができる.
$ wolframscript -wstpserver -continueprofile

In[11]:= WSTPServer`GetKernelID[]

Out[11]= 825c-6cbd-129b

In[12]:=

重要な作業をしているカーネルの確保

現行のカーネルがアンブリッジされたときに,そのカーネルのIDでリクエストするクライアントとのブリッジだけを許可すると便利なことがある.こうすることで,その特定のカーネルを必要とするユーザにだけ利用でき,そのカーネルを必要としないユーザから現行カーネルのセッションを保護することができる.これは設定ファイル鍵ReservePreviouslyConnectedKernelstrueのときのデフォルトの動作である.
Wolfram言語関数WSTPServer`SetReserveKernelまたはWSTPコマンドSetReserveKernelを使うと,ReservePreviouslyConnectedKernelsの値に関わらず現行カーネルを確保することができる.次の手順は,WSTPServer`SetReserveKernelとフロントエンドを使って,カーネルを確保し安全にカーネルからアンブリッジする方法を示したものである:
1. WSTPServerカーネル設定を使ってノートブックを作成する.
2. ノートブック内でWSTPServer`SetReserveKernel[True]を使ってカーネルを確保する.
3. WSTPServer`DisconnectKernel[]を使ってWSTPServerから安全にアンブリッジし接続を解除する.

WSTPServerの監視

WSTPServerはサーバプログラムなので,その現行の状態をチェックして診断的な情報を得ることが役に立つことがある.このためにはWolfram言語関数WSTPServer`GetServerInformationまたはWSTPコマンドGetServerInformationが使える.
以下の手順は,フロントエンドを使ってWSTPServerの現行の状態についての情報を得る方法を示したものである:
1. WSTPServerカーネル設定を使ってノートブックを作成する.
2. ノートブック内でWSTPServer`GetServerInformation[]を使って,WSTPServerの現行の状態についての情報を得る.