2012-01-03 55 views
7

編輯:只是確認你是否可以複製這個或不是有用的。只需一臺計算機即可試用(無需遠程連接)。瞭解Kernel-FrontEnd通信 - 爲什麼我的前端凍結?

更新似乎其他不能在Mac或Win7上重現此,所以它是WinXP的具體或特定於我的機器。在這一點上,我放棄了。


有關前端和內核如何通信的教程是很好的,所以我們可以調試遠程內核問題。任何這樣的一般答案(或其他地方的教程鏈接)都是非常受歡迎的。我已經知道Sascha Kratky的Remote Kernel Strategies

現在的實際問題:當我以任何方式連接到遠程機器(例如使用遠程內核策略)時,前端遲早會凍結。我怎樣才能防止這一點?

下面是如何重現一臺機器上的問題(不需要遠程連接):

  1. 創建一個新的內核配置(評估菜單 - >內核配置選項...)

    選擇高級選項。

    參數來MLOpen:

    -LinkName "[email protected],[email protected]" -LinkMode Listen 
    -LinkProtocol TCPIP -LinkHost "YOUR-IP-HERE" -LinkOptions MLDontInteract 
    

    (更換YOUR-IP-HERE與您的計算機的IP地址,在Windows上,你可以通過在命令窗口中鍵入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`$PreemptiveLinkMathLink`$ServiceLink已創建,而LinkConnectedQ[]返回True

再說一次,請注意只有拖動Manipualate滑塊幾秒鐘後,前端纔會凍結而不會釋放它。

Link to same question on MathGroup.

相關:Firewall settings for remote kernel to work (Mathematica)

+0

致閉幕者:這是一個有效的編程問題。從內核連接可以編程方式建立(到前端,另一個內核或其他軟件),就像我在這裏做的那樣。問題也是關於理解和使用Mathematica的通信協議。 – Szabolcs 2012-01-03 21:06:01

+0

只是我的兩分錢,當你拖動一個圖形元素,通常修改Windows消息循環,直到鼠標向上的消息,以便被拖動的元素或窗口做得很順利。可能的是,這會導致計算機之間的同步消息中斷,從而導致超時情況。 – Motes 2012-01-03 21:28:35

+0

我在Windows 7上嘗試了這一點,但無法重現掛起,這是令人驚訝的,因爲我期望這種方法失敗,因爲前端和內核維護幾個鏈接(除了$ ParentLink):服務鏈接和先佔鏈接。我相信如果先發制人的鏈接設置不正確,動態將會以不好的方式失敗。 – 2012-01-05 23:26:32

回答

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. 

以及更多。可能會有幫助。此外,相同的信息在PDF文件第31頁:

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

內核和前端之間的實際通訊協議必須是非常先進的。