Wolfram mathematica 理解内核前端通信——为什么我的前端会冻结?

Wolfram mathematica 理解内核前端通信——为什么我的前端会冻结?,wolfram-mathematica,mathematica-frontend,mathlink,Wolfram Mathematica,Mathematica Frontend,Mathlink,编辑:只需确认您是否可以复制此内容即可。只需一台计算机即可尝试此操作(无需远程连接) 更新似乎其他人无法在Mac或Win7上复制此功能,因此它要么是WinXP特定的,要么是我的机器特定的。在这一点上,我放弃了 最好有一个关于前端和内核如何通信的教程,这样我们就可以调试远程内核问题。任何这样的一般答案(或其他教程的链接)都是非常受欢迎的。我已经知道Sascha Kratky的作品 现在是一个实际问题:当我以任何方式(例如使用远程内核策略)连接到远程机器时,前端迟早会冻结。我怎样才能防止这种情况

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

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


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

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

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

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

    选择高级选项

    要打开的参数:

    -LinkName "8000@YOUR-IP-HERE,8001@YOUR-IP-HERE" -LinkMode Listen 
    -LinkProtocol TCPIP -LinkHost "YOUR-IP-HERE" -LinkOptions MLDontInteract
    
    (将
    YOUR-IP-HERE
    替换为计算机的IP地址。在Windows上,您可以通过在命令窗口中键入
    ipconfig
    来获得此地址。)

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

  • 打开一个新笔记本,将笔记本的内核设置为您刚刚设置的内核,然后计算一些内容(
    1+1

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

    link=LinkConnect["8000,8001",LinkProtocol->"TCPIP"] (* connect to front end link *)
    
    $ParentLink = link; (* set the front end link as parent link *)
    
    现在,连接已经建立,并且一切都正常工作(除了前端的粉红色消息窗口中的一条消息)

  • 计算
    操作[n,{n,01000,1}]
    。首先,这似乎也有效。现在玩滑块。前端迟早会冻结,需要杀死。对我来说,上下拖动滑块约10秒而不释放它总是足够的

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


    一些注意事项:

    • 我使用的是Windows XP
    • 如果我使用
      LinkProtocol->“SharedMemory”
      ,这个问题就不会出现
    • 使用“计算->中止计算”中止计算不会正常工作
    • 我已经使用
      Links[]
      验证了
      MathLink`$PreemptiveLink
      MathLink`$ServiceLink
      已创建,并且
      LinkConnectedQ[]
      返回
      True
    再次注意,只有在连续拖动
    Manipualate
    滑块几秒钟而不释放滑块后,前端才会冻结

    相关:

    (不是答案,但很难将此作为评论撰写)

    仅供参考,这里有一些关于前端如何与内核对话的信息

    它说,大约在半路上

    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文件中也有相同的信息:


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

    请闭嘴:这是一个有效的编程问题。从内核的连接可以通过编程方式建立(到前端、另一个内核或其他软件),就像我在这里所做的那样。问题还在于理解和使用Mathematica的通信协议。当你拖动一个图形元素时,windows消息循环通常会被修改,直到鼠标向上移动消息为止,这样被拖动的元素或窗口就会平滑地运行。这可能会导致计算机之间的同步消息中断,从而导致超时情况。我在Windows 7上尝试了此操作,但无法再现挂起,这令人惊讶,因为我本以为此方法会失败,因为前端和内核维护多个链接(除了$ParentLink):服务链路和抢占链路。我相信如果先发制人链接设置不正确,Dynamic将以糟糕的方式失败。@Arnoud感谢您的测试!昨天我还收到一封私人回复,有人说他不能在Mac上复制。在这一点上,我认为这只发生在我的机器上。我确实验证了抢先和服务链接是否正确创建(请参阅问题中的第四个注释,我昨天添加了它),至少看起来是这样。我被告知,它们是通过发送SystemFiles/FrontEnd/TextResources/GetFEKernelInit.tr到内核,在前端连接上启动的。