編輯:只是確認你是否可以複製這個或不是有用的。只需一臺計算機即可試用(無需遠程連接)。瞭解Kernel-FrontEnd通信 - 爲什麼我的前端凍結?
更新似乎其他不能在Mac或Win7上重現此,所以它是WinXP的具體或特定於我的機器。在這一點上,我放棄了。
有關前端和內核如何通信的教程是很好的,所以我們可以調試遠程內核問題。任何這樣的一般答案(或其他地方的教程鏈接)都是非常受歡迎的。我已經知道Sascha Kratky的Remote Kernel Strategies。
現在的實際問題:當我以任何方式連接到遠程機器(例如使用遠程內核策略)時,前端遲早會凍結。我怎樣才能防止這一點?
下面是如何重現一臺機器上的問題(不需要遠程連接):
創建一個新的內核配置(評估菜單 - >內核配置選項...)
選擇高級選項。
參數來MLOpen:
-LinkName "[email protected],[email protected]" -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 *)
現在建立連接,並且一切似乎都正常(工作保存在前端的粉紅色消息窗口中的一個消息)
評估
Manipulate[n, {n, 0, 100, 1}]
。首先,這似乎也起作用。現在玩滑塊。遲早前端會凍結並需要被殺死。對我來說,將滑塊上下拖動約10秒鐘而不釋放它總是足夠的。
爲什麼前端會凍結?如何以一種正常工作的方式在前端和內核之間創建TCPIP模式連接?
一些注意事項:
- 我在Windows XP上。
- 如果我使用
LinkProtocol -> "SharedMemory"
,則永遠不會出現該問題。 - 使用評估 - >中止評估中止計算確實正常工作。
- 我已經驗證使用
Links[]
表示MathLink`$PreemptiveLink
和MathLink`$ServiceLink
已創建,而LinkConnectedQ[]
返回True
。
再說一次,請注意只有拖動Manipualate
滑塊幾秒鐘後,前端纔會凍結而不會釋放它。
Link to same question on MathGroup.
相關:Firewall settings for remote kernel to work (Mathematica)
致閉幕者:這是一個有效的編程問題。從內核連接可以編程方式建立(到前端,另一個內核或其他軟件),就像我在這裏做的那樣。問題也是關於理解和使用Mathematica的通信協議。 – Szabolcs 2012-01-03 21:06:01
只是我的兩分錢,當你拖動一個圖形元素,通常修改Windows消息循環,直到鼠標向上的消息,以便被拖動的元素或窗口做得很順利。可能的是,這會導致計算機之間的同步消息中斷,從而導致超時情況。 – Motes 2012-01-03 21:28:35
我在Windows 7上嘗試了這一點,但無法重現掛起,這是令人驚訝的,因爲我期望這種方法失敗,因爲前端和內核維護幾個鏈接(除了$ ParentLink):服務鏈接和先佔鏈接。我相信如果先發制人的鏈接設置不正確,動態將會以不好的方式失敗。 – 2012-01-05 23:26:32