用 WSTP 进行 Wolfram 系统会话间的通讯

LinkCreate["name"]
对要连接的另一程序创建一个链接
LinkConnect["name"]
连接到由另一个程序创建的链接上
LinkClose[link]
关闭一个 WSTP 连接
LinkWrite[link,expr]
将一个表达式写入一个 WSTP 连接
LinkRead[link]
从一个 WSTP 连接上读取一个表达式
LinkRead[link,Hold]
读取一个表达式并立即用 Hold 封装
LinkReadyQ[link]
从链接中找出是否有数据可读
LinkReadyQ[link,t]
等待 t 秒后查看是否有表达式可读取
LinkReadyQ[{link1,link2,}]
从其中一个链接中找出是否有数据可读
LinkReadyQ[{link1,link2,},t]
等待 t 秒后查看是否有表达式可读取
Wolfram 系统会话间的 WSTP 连接.

会话 A

这里在 8000 端口开启了一个链接:

会话 B

这里连接到了 8000 端口的链接上:

会话 A

这里计算 15! 并将其写入链接:

会话 B

这里从链接中读取,获取刚发送的 15!
把数据写回链接:

会话 A

读取在会话 B 中写入的数据:
Wolfram 系统会话间 Wolfram Symbolic Transfer Protocol (WSTP) 连接的一个用途就是传输数据而不用中间文件.
另一个用途就是把一个计算的不同部分分配到不同的会话中去.

会话 A

写入表达式 2+2 但是不计算:

会话 B

从链接中读取表达式,并立即用 Hold 封装:
计算表达式:
如果一个链接已经被之前完成的对 LinkWriteLinkReadLinkActivate 的调用激活,那么表达式就会写入一个缓冲区,而如果缓冲区容得下整个表达式,那么 LinkWrite 会立即返回而不需要对应的 LinkRead. 但当你调用 LinkRead 时,它在从 WSTP 连接中读到完整表达式之前都不会返回.
通过调用 LinkReadyQ[link] 可以知道是否有要读入的内容已准备好. 当 LinkReadyQ 返回 True 时,就可以安全地调用 LinkRead 并可立即开始读入一个表达式. 但如果 LinkReadyQ 返回 False,则在另一个 Wolfram 系统会话中用 LinkWrite 写入一个要读的表达式之前,LinkRead 是阻塞的.

会话 A

在链接中没有要读入的内容在等待,所以如果这时调用 LinkRead,它就会阻塞:

会话 B

这里向链接写入一个表达式:

会话 A

此时在链接中有一个表达式待取:
这时调用 LinkRead 时就不用担心它被阻塞:
LinkReadyQ 可以接受链接对象的列表,并行计算每个链接来决定是否有可以读入的数据. 在单个链接的情况下,第二个变量指明了超时期限,并使 LinkReadyQ 等待直到其中一个链接可以开始使用.
LinkCreate[LinkProtocol->"TCPIP"]
挑选出计算机上任一个未用端口
LinkCreate["number",LinkProtocol->"TCPIP"]
使用指定端口
LinkConnect["number",LinkProtocol->"TCPIP"]
连接到同一计算机的某个端口
LinkConnect["number@host",LinkProtocol->"TCPIP"]
连接到另一计算机的某个端口
通过 TCP/IP 建立 WSTP 链接的途径.
WSTP 可以使用所给计算机系统支持的程序间通讯的所有机制. 在建立当前 Wolfram 系统会话之间的连接时,最常用的机制是互联网 TCP 端口.
大部分计算机系统有几千个编好号的端口,其中一些一般分配给标准的系统服务.
在 WSTP 连接中可以使用任何未分配的端口.

frog.wolfram.com 中的会话

frog.wolfram.com 上找到未分配的端口:

toad.wolfram.com 中的会话

连接 frog.wolfram.com 上的端口:
通过链接传递当前机器名:

frog.wolfram.com 中的会话

读取写入 toad 的表达式:
通过使用 WSTP 连接的互联网端口,你可以在不同机器的 Wolfram 系统会话间方便地传输数据. 所需要的仅仅是存在这些机器间的互联网连接.
由于 WSTP 是一个完全独立的系统,WSTP 连接的每一个终端上的计算机类型不需要相同. WSTP 会注意到这些并优化数据的传输.