了解Kernel-FrontEnd通信 - 为什么我的前端会冻结?

Sza*_*lcs 7 wolfram-mathematica mathematica-frontend mathlink

编辑:只是确认你是否可以重现这个是否有用.尝试此操作只需要一台计算机(无需远程连接).

更新似乎其他人无法在Mac或Win7上重现这一点,因此它可能是WinXP特定的或特定于我的机器.在这一点上,我放弃了.


最好有一个关于前端和内核如何通信的教程,这样我们就可以调试远程内核问题.任何这样的一般答案(或其他地方的教程链接)都是最受欢迎的.我已经了解Sascha Kratky 的远程内核策略.

现在的实际问题是: 当我以任何方式连接到远程机器时(例如使用远程内核策略),前端迟早会冻结.我怎么能阻止这个?

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

  1. 创建新的内核配置(评估菜单 - >内核配置选项...)

    选择高级选项.

    MLOpen的论据:

    -LinkName "8000@YOUR-IP-HERE,8001@YOUR-IP-HERE" -LinkMode Listen 
    -LinkProtocol TCPIP -LinkHost "YOUR-IP-HERE" -LinkOptions MLDontInteract
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  2. 打开一个新的笔记本,将笔记本的内核设置为你刚设置的内核,并评估一些东西(1+1).

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

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

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

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

为什么前端会冻结? 如何以一切正常工作的方式在前端和内核之间创建TCPIP模式连接?


一些说明:

  • 我在Windows XP上.
  • 如果我使用,问题永远不会出现LinkProtocol -> "SharedMemory".
  • 使用评估 - >中止评估中止计算确实可以正常工作.
  • 我已经验证了使用Links[]MathLink`$PreemptiveLinkMathLink`$ServiceLink创建并LinkConnectedQ[]返回True它们.

再次注意,只有在Manipualate不释放滑块的情况下连续拖动滑块几秒钟后,前端才会冻结.

链接到MathGroup上的相同问题.

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

Nas*_*ser 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.
Run Code Online (Sandbox Code Playgroud)

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

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

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