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

EDIT: Было бы полезно просто подтвердить, можете ли вы воспроизвести это или нет. Чтобы попробовать это, нужен только один компьютер (удаленное подключение не требуется).

Обновление Похоже, другие не могут воспроизвести это на 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 секунд, не отпуская его.

Почему внешний интерфейс зависает? Как создать соединение в режиме TCP/IP между внешним интерфейсом и ядром, чтобы все работало правильно?


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

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

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

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

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


person Community    schedule 03.01.2012    source источник
comment
Для доводчиков: это правильный вопрос программирования. Соединение из ядра можно установить программно (либо к внешнему интерфейсу, другому ядру или другому программному обеспечению), как я делаю здесь. Вопрос также в понимании и использовании коммуникационного протокола Mathematica.   -  person Szabolcs    schedule 04.01.2012
comment
Просто мои два цента, когда вы перетаскиваете графический элемент, цикл сообщений Windows обычно изменяется до сообщения мыши вверх, так что перетаскиваемый элемент или окно делают это плавно. Возможно, это приводит к прерыванию сообщений синхронизации между вашими компьютерами, что приводит к тайм-ауту.   -  person Motes    schedule 04.01.2012
comment
Я попробовал это в Windows 7 и не смог воспроизвести зависание, что удивительно, потому что я ожидал, что этот метод не сработает, потому что интерфейс и ядро ​​поддерживают несколько ссылок (помимо $ParentLink): служебную ссылку и упреждающую ссылку. Я считаю, что если упреждающая ссылка настроена неправильно, Dynamic потерпит неудачу в плохом смысле.   -  person Arnoud Buzing    schedule 06.01.2012
comment
@Arnoud Спасибо за тестирование! Вчера я также получил частный ответ, в котором кто-то сказал, что не может воспроизвести на Mac. На данный момент я думаю, что это происходит только на моей машине. Я проверил правильность создания упреждающих и служебных ссылок (см. 4-е примечание в вопросе, я добавил его вчера), по крайней мере, кажется, что это так. Мне сказали, что они запускаются во внешнем интерфейсе путем отправки SystemFiles/FrontEnd/TextResources/GetFEKernelInit.tr ядру.   -  person Szabolcs    schedule 06.01.2012


Ответы (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/

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

person Nasser    schedule 06.01.2012