8

编辑:只是确认您是否可以复制它会很有用。只需一台计算机即可尝试此操作(无需远程连接)。

更新似乎其他人无法在 Mac 或 Win7 上重现此问题,因此它要么是 WinXP 特定的,要么是我的机器特定的。在这一点上,我放弃了。


最好有一个关于前端和内核如何通信的教程,这样我们就可以调试远程内核问题。任何此类一般性答案(或其他地方的教程链接)都非常受欢迎。我已经知道 Sascha Kratky 的Remote Kernel Strategies

现在实际问题是: 当我以任何方式(例如使用远程内核策略)连接到远程机器时,前端迟早会死机。我怎样才能防止这种情况?

以下是如何在单台机器上重现问题(无需远程连接):

  1. 创建一个新的内核配置(Evaluation menu -> Kernel Configuration Options...)

    选择高级选项。

    MLOpen 的参数:

    -LinkName "8000@YOUR-IP-HERE,8001@YOUR-IP-HERE" -LinkMode Listen 
    -LinkProtocol TCPIP -LinkHost "YOUR-IP-HERE" -LinkOptions MLDontInteract
    

    (替换为您计算机的 IP 地址。在 Windows 上,您可以通过在命令窗口中YOUR-IP-HERE键入来获取此地址。)ipconfig

    启动内核的 Shell 命令:留空(我们将手动执行)

  2. 打开一个新笔记本,将笔记本的内核设置为您刚刚设置的内核,然后评估某些内容 ( 1+1)。

  3. 现在我们需要在连接超时之前手动启动内核。因此,在命令行模式下启动一个新内核 ( math),并评估以下内容:

    link=LinkConnect["8000,8001",LinkProtocol->"TCPIP"] (* connect to front end link *)
    
    $ParentLink = link; (* set the front end link as parent link *)
    

    现在连接已建立,一切似乎都正常工作(除了前端粉红色消息窗口中的一条消息)

  4. 评估Manipulate[n, {n, 0, 100, 1}]。首先,这似乎也有效。现在玩滑块。前端迟早会冻结,需要被杀死。对我来说,上下拖动滑块约 10 秒而不释放它总是足够的。

为什么前端冻结? 如何在前端和内核之间创建 TCPIP 模式连接,以确保一切正常?


一些注意事项:

  • 我在 Windows XP 上。
  • 如果我使用LinkProtocol -> "SharedMemory".
  • 使用评估中止计算 -> 中止评估确实可以正常工作。
  • 我已经使用它进行了验证Links[]MathLink`$PreemptiveLink并在它们MathLink`$ServiceLink上创建并LinkConnectedQ[]返回True

Manipualate同样,请注意,只有在连续拖动滑块几秒钟而不释放它后,前端才会冻结。

链接到 MathGroup 上的相同问题。

相关:远程内核工作的防火墙设置(Mathematica)

4

1 回答 1

2

(不是答案,但很难把它写成评论)

仅供参考,这里有一些关于前端如何与内核对话的信息 http://reference.wolfram.com/mathematica/tutorial/AdvancedDynamicFunctionality.html

大约一半下来,它说

The front end and kernel communicate with each other through several 
MathLink connections, known as the main link, the preemptive link, 
and the service link. The main and preemptive links are pathways by 
which the front end can send evaluation requests to the kernel, and 
the kernel can respond with results. The service link works in reverse, 
with the kernel sending requests to the front end.

还有更多。可能会有所帮助。此外,第 31 页的 PDF 文件中包含相同的信息:

http://www.wolfram.com/learningcenter/tutorialcollection/DynamicInteractivity/

内核和前端之间的实际消息传递协议必须非常先进。

于 2012-01-06T08:03:41.650 回答