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

Mathematicaセッション間の MathLinkコネクション
セッション A
8000番のポートでリンクをスタートさせる.
In[1]:= link = LinkCreate["8000"]
Out[1]=LinkObject[8000@frog.wolfram.com, 4, 4]
セッション B
8000番ポートのリンクと接続する.
In[1]:=Link = LinkConnect["8000"]
Out[1]=LinkObject["8000@frog.wolfram.com", 4, 4]
セッション A
15!を評価し,リンクにそれを書き込む.
In[2]:=LinkWrite[link, 15!]
セッション B
リンクから読み出すと送信した 15!が得られる.
In[2]:=LinkRead[link]
Out[2]=1307674368000
リンクにデータを書き戻す.
In[3]:=LinkWrite[link, N[%^6]]
セッション A
セッションBで書き込んだデータを読み 出す.
In[3]:=LinkRead[link]
Out[3]= 
MathLinkコネクションを使えば, Mathematicaセッション間の中間ファイルを使わないデータ転送が可能になる.
その他の使い道としては,計算の一部を別のセッションに送ることがある.
セッション A
2 + 2を評価せずにリンクに書き込む.
In[4]:=LinkWrite[link, Unevaluated[2 + 2]]
セッション B
リンクから式を読み出し,即座に Holdで包み込む.
In[4]:=LinkRead[link, Hold]
Out[4]=Hold[2 + 2]
式を評価する.
In[5]:=ReleaseHold[%]
Out[5]=4
LinkWriteを呼び出すと,LinkWriteは式を MathLinkコネクションに書き込んだあと,直ちにリターンする.しかし,LinkReadは MathLinkコネクションから式を完全に読み出すまでリターンしない.
読出しが可能かどうかを LinkReadyQ[link]の呼出しで知ることができる.LinkReadyQ が Trueを返したら,安全に LinkReadを呼び出し,式を読み込むことができる. LinkReadyQが Falseを返した場合, LinkReadは読み出すべき式をもう一方の Mathematicaセッションの LinkWriteが書き込むまでブロック する.
セッション A
読まれるべきものがリンク 上にない. LinkReadが呼ばれると,ブロッ クする.
In[5]:=LinkReadyQ[link]
Out[5]=False
セッション B
リンクに式を書く.
In[6]:=LinkWrite[link, x + y]
セッション A
読出しを待っている式がリンク上に存在する.
In[6]:=LinkReadyQ[link]
Out[6]=True
LinkReadをブロックされる恐れなしに呼び出すことができる.
In[7]:=LinkRead[link]
Out[7]=x + y

MathLinkのリンクを設定する方法
コンピュータシステムがサポートしていれば,いかなるプログラム間通信のメカニズムでもMathLinkは利用することができる.並列する Mathematicaセッション間のコネクションを確立するには,インター ネットのTCPポートを利用することが最も一般的である.
ほとんどのコンピュータシステムには利用可能なポートが数千個あり,そのうちのいくつかは標準的なサービスにすでに利用されている.
未使用のポートは MathLinkコネクションに使うことができる.
frog.wolfram.com上のセッション
frog.wolfram.comが使用していないポートを見付ける.
In[8]:=link = LinkCreate[ ]
Out[8]=LinkObject["2981@frog.wolfram.com", 5, 5]
toad.wolfram.com上のセッション
そのポートに接続する.
In[7]:=link = LinkConnect["2981@frog.wolfram.com"]
Out[7]=LinkObject["2981@frog.wolfram.com", 5, 5]
マシン名をリンク上で転送する.
In[8]:=LinkWrite[link, $MachineName]
frog.wolfram.com上のセッション
toadが書いた式を読む.
In[9]:=LinkRead[link]
Out[9]=toad
インターネットのポートを MathLinkコネクションに利用すれば,異なるMathematicaセッション間でのデータ転送を簡単に行うことができる.インターネットのコネクションが転送を実行するマシン間にあればよい.
MathLinkは全くシステムに依存していないため, MathLinkコネクションの両端のコンピュータが同一の種類である必要はない.ただし,実際のリンクでは,コンピュータの機種の違いからくるデータ形式の違い等に対処するために MathLink内で転送処理に対する最適化が図られる.
|