编辑:只是确认您是否可以复制它会很有用。只需一台计算机即可尝试此操作(无需远程连接)。
更新似乎其他人无法在 Mac 或 Win7 上重现此问题,因此它要么是 WinXP 特定的,要么是我的机器特定的。在这一点上,我放弃了。
最好有一个关于前端和内核如何通信的教程,这样我们就可以调试远程内核问题。任何此类一般性答案(或其他地方的教程链接)都非常受欢迎。我已经知道 Sascha Kratky 的Remote Kernel Strategies。
现在实际问题是: 当我以任何方式(例如使用远程内核策略)连接到远程机器时,前端迟早会死机。我怎样才能防止这种情况?
以下是如何在单台机器上重现问题(无需远程连接):
创建一个新的内核配置(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 命令:留空(我们将手动执行)
打开一个新笔记本,将笔记本的内核设置为您刚刚设置的内核,然后评估某些内容 (
1+1
)。现在我们需要在连接超时之前手动启动内核。因此,在命令行模式下启动一个新内核 (
math
),并评估以下内容:link=LinkConnect["8000,8001",LinkProtocol->"TCPIP"] (* connect to front end link *) $ParentLink = link; (* set the front end link as parent link *)
现在连接已建立,一切似乎都正常工作(除了前端粉红色消息窗口中的一条消息)
评估
Manipulate[n, {n, 0, 100, 1}]
。首先,这似乎也有效。现在玩滑块。前端迟早会冻结,需要被杀死。对我来说,上下拖动滑块约 10 秒而不释放它总是足够的。
为什么前端冻结? 如何在前端和内核之间创建 TCPIP 模式连接,以确保一切正常?
一些注意事项:
- 我在 Windows XP 上。
- 如果我使用
LinkProtocol -> "SharedMemory"
. - 使用评估中止计算 -> 中止评估确实可以正常工作。
- 我已经使用它进行了验证
Links[]
,MathLink`$PreemptiveLink
并在它们MathLink`$ServiceLink
上创建并LinkConnectedQ[]
返回True
。
Manipualate
同样,请注意,只有在连续拖动滑块几秒钟而不释放它后,前端才会冻结。