Estamos desarrollando una pequeña aplicación de servidor c. La aplicación del servidor procesa algunos datos y responde al cliente. Para mantener la parte de procesamiento de datos configurable y flexible, decidimos ir a las secuencias de comandos y, en función de la disponibilidad de varios módulos listos, decidimos apostar por Python. Estamos utilizando la API de Python-C para enviar/recibir datos entre c y python.Python-C api concurrence issue
El algoritmo funciona algo como esto: -
- Server recibe algunos datos de cliente, estos datos se almacenan en un diccionario creado en c. El diccionario se crea usando la función api PyDict_New(); desde C. La entrada se almacena como un par de valores clave en el diccionario utilizando la función api PyDict_SetItemString();
- A continuación, ejecutamos el script python PyRun_SimpleString(); pasando la secuencia de comandos como un parámetro. Este script hace uso del diccionario creado en c. Tenga en cuenta que hacemos que el diccionario creado en c, accesible para el script, utilice los métodos PyImport_AddModule(); y PyModule_AddObject();
- Almacenamos el resultado del procesamiento de datos en el script como un par de valores clave en el mismo diccionario creado anteriormente. El código c simplemente puede acceder a la variable de resultado (par clave-valor) después de que se haya ejecutado el script.
El problema El problema que enfrentamos es en el caso de solicitudes simultáneas que vienen de diferentes clientes. Cuando llegan varias solicitudes de diferentes clientes, tendemos a objetar excepciones de recuento de referencias. Tenga en cuenta que, para cada solicitud que entra para un usuario, creamos un diccionario independiente solo para ese usuario. Para superar este problema, abarcamos la llamada a PyRun_SimpleString(); dentro de PyEval_AcquireLock(); y PyEval_ReleaseLock() ;, pero al hacer esto, la ejecución del script es una llamada de bloqueo. Entonces, si un script tarda mucho tiempo en ejecutarse, todos los demás usuarios también están esperando una respuesta.
Podría por favor sugerir el mejor enfoque posible o dar punteros a donde estamos yendo mal. Por favor, hazme ping para más información.
Cualquier ayuda/guía será apreciada.
Gracias por la referencia Jane. Por cierto, hice llamadas a esas funciones, pero aún no funciona. – Will