EDIT: Было бы полезно просто подтвердить, можете ли вы воспроизвести это или нет. Чтобы попробовать это, нужен только один компьютер (удаленное подключение не требуется).
Обновление Похоже, другие не могут воспроизвести это на Mac или Win7, так что это либо специфично для WinXP, либо специфично для моей машины. В этот момент я сдаюсь.
Было бы неплохо иметь учебник о том, как взаимодействуют интерфейс и ядро, чтобы мы могли устранять проблемы с удаленным ядром. Любые такие общие ответы (или ссылки на учебники в других местах) приветствуются. Я уже знаком с стратегиями удаленного ядра Саши Кратки.
Теперь практический вопрос: когда я каким-либо образом подключаюсь к удаленной машине (например, используя стратегии удаленного ядра), интерфейс рано или поздно зависает. Как я могу предотвратить это?
Вот как можно воспроизвести проблему на одной машине (удаленное подключение не требуется):
Создайте новую конфигурацию ядра (меню Оценка -> Параметры конфигурации ядра...)
Выберите Дополнительные параметры.
Аргументы для 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
в командном окне.)Команда оболочки для запуска ядра: оставьте пустым (будем делать это вручную)
Откройте новую записную книжку, установите ядро записной книжки на то, которое вы только что установили, и оцените что-нибудь (
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 секунд, не отпуская его.
Почему внешний интерфейс зависает? Как создать соединение в режиме TCP/IP между внешним интерфейсом и ядром, чтобы все работало правильно?
Некоторые примечания:
- Я на Windows XP.
- Проблема никогда не появляется, если я использую
LinkProtocol -> "SharedMemory"
. - Прерывание вычислений с помощью Evaluation -> Abort Evaluation работает правильно.
- С помощью
Links[]
я проверил, чтоMathLink`$PreemptiveLink
иMathLink`$ServiceLink
созданы, аLinkConnectedQ[]
возвращает для нихTrue
.
Опять же, обратите внимание, что внешний интерфейс зависает только после непрерывного перетаскивания ползунка Manipualate
в течение нескольких секунд, не отпуская его.
Ссылка на тот же вопрос в MathGroup.
Связано: Настройки брандмауэра для работы удаленного ядра (Mathematica)< /а>