2012-01-03 11 views
7

EDITAR: Solo una confirmación de si puede reproducir esto o no sería útil. Solo se necesita una sola computadora para probar esto (no es necesaria una conexión remota).Entender la comunicación Kernel-FrontEnd: ¿Por qué se congela mi Front End?

Actualización Parece que otros no pueden reproducir esto en Mac o Win7, por lo que es específico de WinXP o específico de mi máquina. En este punto, me estoy rindiendo.


Sería bueno tener un tutorial sobre cómo el front-end y el Kernel se comunican, por lo que se puede depurar problemas de núcleo remoto. Cualquier respuesta general (o enlaces a tutoriales en otros lugares) son bienvenidos. Ya estoy al tanto de Remote Kernel Strategies por Sascha Kratky.

Ahora la pregunta práctica: Cuando me conecto a una máquina remota de alguna manera (por ejemplo, usando estrategias remotas de kernel), la interfaz se congelará tarde o temprano. ¿Cómo puedo prevenir esto?

continuación se explica cómo reproducir el problema en una sola máquina (sin conexión remota es necesario):

  1. Crear una nueva configuración del núcleo (menú de Evaluación -> Opciones de configuración del kernel ...)

    Seleccionar Opciones avanzadas.

    Argumentos a MLOpen:

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

    (.. Reemplazar YOUR-IP-HERE con la dirección IP de su ordenador En Windows, puede obtener esta escribiendo ipconfig en una ventana de comandos) de comandos

    Shell para lanzar núcleo: dejar vacío (lo haremos manualmente)

  2. Abra una nueva libreta, configure el kernel de la libreta que acaba de configurar y evalúe algo (1+1).

  3. Ahora tenemos que iniciar el kernel manualmente, antes de que la conexión expire. Así que empieza un nuevo kernel (math) en el modo de línea de comandos, y evaluar lo siguiente:

    link=LinkConnect["8000,8001",LinkProtocol->"TCPIP"] (* connect to front end link *) 
    
    $ParentLink = link; (* set the front end link as parent link *) 
    

    Ahora se establece la conexión, y todo parece funcionar correctamente (salvo por el mensaje en la ventana de mensaje de rosa de la parte delantera)

  4. Evaluar Manipulate[n, {n, 0, 100, 1}]. Primero, esto parece funcionar también. Ahora juega con el control deslizante. Tarde o temprano, la interfaz se congelará y debe ser eliminada. Para mí, arrastrar el control deslizante hacia arriba y hacia abajo durante ~ 10 segundos sin soltarlo siempre es suficiente.

¿Por qué el Front End se congela? ¿Cómo puedo crear una conexión de modo TCPIP entre la interfaz y el kernel de forma que todo funcione correctamente?


Algunas notas:

  • estoy en Windows XP.
  • El problema nunca aparece si uso LinkProtocol -> "SharedMemory".
  • Cancelación de cálculos utilizando Evaluación -> Anular evaluación funciona correctamente.
  • He verificado usando Links[] que MathLink`$PreemptiveLink y MathLink`$ServiceLink se crean y LinkConnectedQ[] devuelve True en ellos.

Nuevamente, tenga en cuenta que el Front End se congelará solo después de arrastrar el control deslizante Manipualate continuamente durante unos segundos sin soltarlo.

Link to same question on MathGroup.

relacionadas: Firewall settings for remote kernel to work (Mathematica)

+0

Para los cerradores: esta es una pregunta de programación válida. La conexión desde el kernel se puede establecer programáticamente (ya sea en el front-end, otro kernel u otro software), como lo estoy haciendo aquí. La pregunta también es sobre la comprensión y el uso del protocolo de comunicación de Mathematica. – Szabolcs

+0

Simplemente mis dos centavos, cuando arrastra un elemento gráfico, ese bucle de mensaje de Windows normalmente se modifica hasta que aparece el mensaje del mouse hacia arriba, de modo que el elemento o la ventana que se está arrastrando lo hace sin problemas. Posiblemente, esto está provocando la interrupción de los mensajes de sincronización entre las computadoras, lo que da como resultado una condición de tiempo de espera excedido. – Motes

+0

Intenté esto en Windows 7 y no pude reproducir el hang, lo cual es sorprendente porque esperaba que este método fallara porque el frontend y el kernel mantienen varios enlaces (además de $ ParentLink): un enlace de servicio y un enlace preventivo. Creo que si el enlace preventivo no está configurado correctamente, Dynamic fallará de manera incorrecta. –

Respuesta

2

(no una respuesta, pero difícil de escribir esto como comentario)

FYI, hay un poco de información acerca de cómo las conversaciones frontend el núcleo aquí http://reference.wolfram.com/mathematica/tutorial/AdvancedDynamicFunctionality.html

a mitad de camino hacia abajo, dice

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. 

y más allí. Puede ser que ayude Además, la misma información se encuentra en el archivo PDF en la página 31:

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

El protocolo de mensajería real entre el núcleo y el extremo frontal debe ser muy avanzado.

Cuestiones relacionadas