Понимание взаимодействия Kernel-FrontEnd - Почему мой Front End зависает? - PullRequest
7 голосов
/ 03 января 2012

РЕДАКТИРОВАТЬ: Просто подтверждение того, можете ли вы воспроизвести это или нет, было бы полезно.Для этого требуется только один компьютер (удаленное соединение не требуется).

Обновление Кажется, другие не могут воспроизвести это на Mac или Win7, так что это специфично для WinXP или специфичнок моей машине.На данный момент я сдаюсь.


Было бы хорошо иметь учебник о том, как интерфейс и ядро ​​взаимодействуют, чтобы мы могли отлаживать проблемы с удаленным ядром.Любые такие общие ответы (или ссылки на учебники в других местах) приветствуются.Я уже знаю о Стратегиях удаленного ядра Саша Кратки.

Теперь практический вопрос: Когда я подключаюсь к удаленной машине любым способом (например, используя удаленное ядро)стратегии), интерфейс рано или поздно замерзнет.Как я могу предотвратить это?

Вот как воспроизвести проблему на одном компьютере (удаленное соединение не требуется):

  1. Создать новую конфигурацию ядра (меню Evaluation -> Параметры конфигурации ядра ...)

    Выберите дополнительные параметры.

    Аргументы для MLOpen:

    -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 в командном окне.)

    Команда оболочки для запуска ядра: оставьте пустым (мы сделаем это вручную)

  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 секунд без его отпускания всегда достаточно.

Почему Front End зависает? Как я могу создать TCPIP-режим соединения между внешним интерфейсом и ядром таким образом, чтобы все работало правильно?


Некоторые примечания:

  • Я на Windows XP.
  • Проблема никогда не появляется, если я использую LinkProtocol -> "SharedMemory".
  • Прерывание вычислений с использованием Evaluation -> Abort Evaluation работает правильно.
  • Я подтвердил с помощью Links[], что MathLink`$PreemptiveLinkи MathLink`$ServiceLink создаются, а LinkConnectedQ[] возвращает True для них.

Снова обратите внимание, что интерфейсная часть будет зависать только после непрерывного перетаскивания ползунка Manipualate в течение нескольких секунд без отпусканияit.

Ссылка на тот же вопрос в MathGroup.

Related: Настройки брандмауэра для работы удаленного ядра (Mathematica)

1 Ответ

2 голосов
/ 06 января 2012

(не ответ, но сложно написать это как комментарий)

Кстати, немного информации о том, как интерфейс взаимодействует с ядром, здесь 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/

Фактический протокол обмена сообщениями между ядром и внешним интерфейсом должен быть очень продвинутым.

...