Stiamo sviluppando un'applicazione server c piccola. L'applicazione server esegue alcuni processi di elaborazione dati e risponde al client. Per mantenere la parte di elaborazione dati configurabile e flessibile abbiamo deciso di utilizzare lo scripting e in base alla disponibilità di vari moduli pronti abbiamo deciso di utilizzare Python. Stiamo usando Python-C api per inviare/ricevere i dati tra c e python.Problema di concorrenza Python-C api
L'algoritmo funziona in questo modo: -
- Server riceve alcuni dati dal client, questi dati sono memorizzati in un dizionario creato nel c. Il dizionario viene creato utilizzando la funzione api PyDict_New(); da c. L'input è memorizzato come una coppia di valori chiave nel dizionario usando la funzione api PyDict_SetItemString();
- Successivamente, eseguiamo lo script python PyRun_SimpleString(); passare lo script come parametro. Questo script utilizza il dizionario creato in c. Nota, creiamo il dizionario creato in c, accessibile per lo script usando i metodi PyImport_AddModule(); e PyModule_AddObject();
- Memorizziamo il risultato dell'elaborazione dei dati nello script come una coppia di valori chiave nello stesso dizionario creato sopra. Il codice c può quindi semplicemente accedere alla variabile risultato (coppia chiave-valore) dopo che lo script è stato eseguito.
Il problema Il problema che stiamo affrontando è nel caso di richieste simultanee provenienti da diversi clienti. Quando arrivano più richieste da diversi client, tendiamo a fare eccezioni di conteggio dei riferimenti agli oggetti. Si prega di notare che per ogni richiesta che arriva per un utente, creiamo un dizionario indipendente solo per quell'utente. Per superare questo problema abbiamo incluso la chiamata a PyRun_SimpleString(); all'interno di PyEval_AcquireLock(); e PyEval_ReleaseLock() ;, ma facendo ciò si è verificato che l'esecuzione dello script fosse una chiamata bloccante. Quindi, se uno script richiede molto tempo per essere eseguito, tutti gli altri utenti sono in attesa di una risposta.
Potresti suggerire il miglior approccio possibile o dare indicazioni su dove stiamo andando male. Per favore, mandami un messaggio per maggiori informazioni.
Qualsiasi aiuto/guida sarà apprezzato.
Grazie per il riferimento Jane. Per inciso, avevo fatto chiamate a quelle funzioni, ma non funzionava ancora. – Will