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]=

Mathematica 进程间 MathLink 连接的一个用途就是不使用中间文件而传输数据.

另一个用途就是把一个计算的不同部分分配到不同的进程中去.

会话 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 连接写入一个表达式,并立即返回. 当调用 LinkRead 时,直到从 MathLink 读入一个完整的表达式后才返回.

通过调用 LinkReadyQ[link] 可以知道是否有要读入的内容已准备好. 当 LinkReadyQ 返回 True 时,就可以安全地调用 LinkRead 开始立即读入一个表达式. 但如果 LinkReadyQ 返回 False 时,则在另一个 Mathematica 进程中用 LinkWrite 写入一个要读的表达式之前 LinkRead 是锁住的.

会话 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 可以采取链接对象的列表,并行计算每个链接来决定是否有可以读入的数据. 在一个单链接的情况下,第二个变量指明了用完时间的阶段,并使 LinkReadyQ 等待直到链接之一可以开始使用.

LinkCreate[LinkProtocol->"TCPIP"]挑选出计算机上任一个未用端口
LinkCreate["number",LinkProtocol->"TCPIP"]
用一个指定端口
LinkConnect["number",LinkProtocol->"TCPIP"]
连接到同一计算机的一个端口
LinkConnect["number@host",LinkProtocol->"TCPIP"]
连接到另一计算机的一个端口

通过 TCP/IP 建立 MathLink 连接的途径.

MathLink 可以使用所给计算机系统支持的程序间通讯的所有机制. 在建立当前 Mathematica 进程之间的联系时,最常用的机制是互联网 TCP 端口.

大部分计算机系统有几千个可编号的端口,其中一些分配给标准的系统服务.

MathLink 连接中可以使用任何未分配的端口.

frog.wolfram.com 上的会话

 找出未分配的端口.
In[14]:=
Click for copyable input
Out[14]=

toad.wolfram.com 上的会话

连接到  的端口上.
In[15]:=
Click for copyable input
Out[15]=
用链接发送当前机器名.
In[16]:=
Click for copyable input

frog.wolfram.com 上的会话

读出在  上写入的表达式.
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 »