Pregunta

Tengo una aplicación GUI pitón que utiliza una función de larga ejecución de un .so / .dll que llama a través ctypes.

Estoy buscando una manera de comunicarse con la función mientras se está ejecutando en un proceso o subproceso separado, de modo que pueda solicitar a la resolución anticipada (que requiere un trabajo en el lado C antes de devolver un resultado parcial). Supongo que esto tendrá algún tipo de señal de recepción o la lectura de las tuberías, pero quiero mantenerlo lo más simple posible.

¿Qué consideraría el mejor enfoque para resolver este tipo de problema? Soy capaz de cambiar el código en ambos lados y la pitón C.

¿Fue útil?

Solución

Hay dos partes que necesita para responder aquí: uno si la forma de comunicarse entre los dos procesos (su interfaz gráfica de usuario y el proceso de ejecución de la función), y el otro es cómo cambiar su función por lo que responde a las peticiones asincrónicas ( "Oh, me han dicho a devolver sólo lo que tenga").

La elaboración de la respuesta a la segunda pregunta, probablemente dictará la respuesta a la primera. Usted puede hacerlo por medio de señales (en cuyo caso se obtiene un manejador de señales que recibe el control del proceso, puede buscar las instrucciones más detalladas en otros lugares, y cambiar sus estructuras internas de datos antes de devolver el control a la función), o podría tener su función supervisar una interfaz de control para los comandos (cada milisegundo, comprobar para ver si hay un comando de espera, y si no, ver lo que es).

En el primer caso, te gustaría señal de ANSI C manipulación (señal (), sighandler_t), en la segunda lo que probablemente quiere una tubería o similar (tubería () y seleccionar ()).

Otros consejos

Usted menciona que se puede cambiar tanto el C y Python lados. Para evitar tener que escribir ningún código o tomas de señal en C, que podría ser más fácil de romper la función C de gran tamaño en 3 funciones separadas más pequeñas que realizan la instalación, una pequeña parcela de trabajo, y la limpieza. La parcela de trabajo debe estar entre alrededor de 1 ms y 1 segundo tiempo de ejecución para lograr un equilibrio entre la capacidad de respuesta y bajo costo operativo. Puede ser difícil para romper los cálculos en incluso trozos de este tipo en la cara del cambio de tamaño de los datos, sino que tendría el mismo reto en una única gran función que también hizo de E / S.

Escribir un proceso de trabajo en Python que llama las 3 funciones a través ctypes. Haga que el proceso de trabajo de comprobar un objeto cola de un mensaje de la interfaz gráfica de usuario para detener el cálculo temprano. Asegúrese de utilizar la no-bloqueo de llamadas Queue.get_nowait en lugar de Queue.get. Si el proceso de trabajo encuentra un mensaje para dejar de fumar temprano, llame a la C limpiar el código y devuelve el resultado parcial.

Si estás en * nix registrar un manejador de señales para SIGUSR1 o SIGINT en su programa de C y después de usar Python os.kill para enviar la señal.

Usted ha dicho que:. Señales y tuberías

Esto no tiene por qué ser demasiado complejo, pero va a ser un heck de mucho más fácil si utiliza una estructura existente que si se intenta liar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top