Понимание взаимодействия Kernel-FrontEnd - Почему мой Front End зависает?

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

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


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

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

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

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

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

    Аргументы к 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 ползунок непрерывно в течение нескольких секунд, не отпуская его.

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

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

1 ответ

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

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

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

Другие вопросы по тегам