MathLink を使った Mathematica セッション間の通信

LinkCreate["name"]別プログラムと通信するためのリンクを作成する
LinkConnect["name"]別プログラムで作成されたリンクと接続する
LinkClose[link]MathLink 接続を閉じる
LinkWrite[link,expr]式を MathLink 接続に書き込む
LinkRead[link]MathLink 接続から式を読み出す
LinkRead[link,Hold]式を読み出し,即座にその式をHoldで包み込む
LinkReadyQ[link]リンクに読出し可能なデータがあるかどうかをチェックする
LinkReadyQ[link,t]式が読む準備ができているかどうかを調べるのに t 秒まで待つ
LinkReadyQ[{link1,link2,...}]リンクのうちのひとつから読む準備のできたデータがあるかどうかを調べる
LinkReadyQ[{link1,link2,...},t]式が読む準備ができているかどうかを調べるのに t 秒まで待つ

Mathematica セッション間の MathLink 接続

セッション A

8000番のポートでリンクをスタートさせる.
In[1]:=
Click for copyable input
Out[1]=

セッション B

8000番ポートのリンクと接続する.
In[2]:=
Click for copyable input
Out[2]=

セッション A

を評価し,リンクにそれを書き込む.
In[3]:=
Click for copyable input

セッション B

リンクから読み出すと送信したが得られる.
In[4]:=
Click for copyable input
Out[4]=
リンクにデータを書き戻す.
In[5]:=
Click for copyable input

セッション A

セッションBで書き込んだデータを読み出す.
In[6]:=
Click for copyable input
Out[6]=

MathLink 接続を使えば,Mathematica セッション間の中間ファイルを使わないデータ転送が可能になる.

その他の使い道としては,計算の一部を別のセッションに送ることがある.

セッション A

を評価せずにリンクに書き込む.
In[7]:=
Click for copyable input

セッション B

リンクから式を読み出し,即座にHoldで包み込む.
In[8]:=
Click for copyable input
Out[8]=
式を評価する.
In[9]:=
Click for copyable input
Out[9]=

LinkWriteを呼び出すと,式を MathLink 接続に書き込んだ後,直ちに戻る.しかし,LinkReadMathLink 接続から式を完全に読み出すまで戻らない.

読出しが可能かどうかをLinkReadyQ[link]の呼出しで知ることができる.LinkReadyQTrueを返したら,安全にLinkReadを呼び出し,式を読み込むことができる.LinkReadyQFalseを返した場合,LinkReadは読み出すべき式をもう一方の Mathematica セッションのLinkWriteが書き込むまでブロックする.

セッション A

読まれるべきものがリンク上にない.LinkReadが呼ばれると,ブロックする.
In[10]:=
Click for copyable input
Out[10]=

セッション B

リンクに式を書く.
In[11]:=
Click for copyable input

セッション A

読出しを待っている式がリンク上に存在する.
In[12]:=
Click for copyable input
Out[12]=
LinkReadをブロックされる恐れなしに呼び出すことができる.
In[13]:=
Click for copyable input
Out[13]=

LinkReadyQはリンクオブジェクトのリストを取り,読むデータがあるかどうかを判断するために各リンクを並列で評価することができる.単独のリンクの場合のように,第2引数でタイムアウトの周期を指定するため,LinkReadyQはリンクのいずれかが使う準備ができるまで待つことになる.

LinkCreate[LinkProtocol->"TCPIP"]コンピュータが使用していないポートを取得する
LinkCreate["number",LinkProtocol->"TCPIP"]
特定のポートを使用する
LinkConnect["number",LinkProtocol->"TCPIP"]
同一コンピュータのポートに接続する
LinkConnect["number@host",LinkProtocol->"TCPIP"]
別のコンピュータのポートに接続する

TCP/IPで MathLink のリンクを設定する方法

コンピュータシステムがサポートしていれば,いかなるプログラム間通信のメカニズムでも MathLink は利用することができる.並列する Mathematica セッション間の接続を確立するには,インターネットのTCPポートを利用することが一般的である.

ほとんどのコンピュータシステムには利用可能なポートが数千個あり,そのうちのいくつかは標準的なサービスにすでに利用されている.

未使用のポートは MathLink 接続に使うことができる.

上のセッション

が使用していないポートを見付ける.
In[14]:=
Click for copyable input
Out[14]=

上のセッション

のポートに接続する.
In[15]:=
Click for copyable input
Out[15]=
マシン名をリンク上で転送する.
In[16]:=
Click for copyable input

上のセッション

に書かれた式を読む.
In[17]:=
Click for copyable input
Out[17]=

インターネットのポートを MathLink 接続に利用すれば,異なる Mathematica セッション間でのデータ転送を簡単に行うことができる.インターネット接続が転送を実行するマシン間にあればよい.

MathLink は全くシステムに依存していないため,MathLink 接続の両端のコンピュータが同一の種類である必要はない.ただし,実際のリンクでは,コンピュータの機種の違いからくるデータ形式の違い等に対処するために MathLink 内で転送処理に対する最適化が図られる.

New to Mathematica? Find your learning path »
Have a question? Ask support »