Domanda

Ho una GUI app pitone che utilizza una funzione in esecuzione lungo da un .so / .dll chiama attraverso ctypes.

sto cercando un modo per comunicare con la funzione mentre è in esecuzione in un thread o processo separato, in modo che possa richiederlo alla chiusura anticipata (che richiede un certo lavoro sul lato C prima di restituire un risultato parziale). Suppongo che questo avrà bisogno di un qualche tipo di segnale di ricezione o leggere da tubi, ma voglio tenerlo il più semplice possibile.

Cosa vorresti prendere in considerazione l'approccio migliore per risolvere questo tipo di problema? Sono in grado di cambiare il codice sia sul pitone e lati C.

È stato utile?

Soluzione

Ci sono due parti che avrete bisogno di rispondere qui: uno se come per la comunicazione tra i due processi (la vostra interfaccia grafica e il processo di esecuzione della funzione), e l'altro è come cambiare la funzione in modo che risponde alle richieste asincrone ( "Oh, mi è stato detto di tornare solo quello che ho").

Elaborare la risposta alla seconda domanda sarà probabilmente dettare la risposta alla prima. Si potrebbe farlo da segnali (nel qual caso si ottiene un gestore di segnale che ottiene il controllo del processo, può guardare per istruzioni più dettagliate altrove, e modificare le strutture dati interne, prima di restituire il controllo alla funzione), o si potrebbe avere la funzione monitorare un'interfaccia di controllo per i comandi (ogni millisecondo, controllare per vedere se c'è un attesa di comando, e se c'è, cosa si tratta).

Nel primo caso, che ci si vuole segnale ANSI C movimentazione (segnale (), sighandler_t), nella seconda si sarebbe probabilmente desidera un tubo o simile (pipe () e selezionare ()).

Altri suggerimenti

Si parla che è possibile modificare entrambi i lati di Python C e. Per evitare di dover scrivere ogni socket o codice di segnali in C, potrebbe essere più facile da rompere la funzione grande C in 3 piccole funzioni distinte che eseguono configurazione, una piccola particella di lavoro, e la pulizia. Il pacco lavoro dovrebbe essere compreso tra circa 1 ms e 1 secondo fase di esecuzione per trovare un equilibrio tra reattività e basso overhead. Può essere difficile da rompere i calcoli in anche pezzi come questo a fronte di cambiare le dimensioni dei dati, ma si avrebbe la stessa sfida in un unico grande funzione che ha fatto anche di I / O.

Scrivi un processo di lavoro in Python che chiama le 3 funzioni attraverso ctypes. Avere il processo di lavoro controllare oggetto un coda per un messaggio dalla GUI per fermare il calcolo presto. Assicurarsi di utilizzare il non-blocking Queue.get_nowait chiamata invece di Queue.get. Se il processo di lavoro trova un messaggio di smettere presto, chiamare il C ripulire il codice e restituire il risultato parziale.

Se siete su * nix registrare un gestore di segnale per SIGUSR1 o SIGINT nel vostro programma C poi da Python utilizzare os.kill per inviare il segnale.

L'hai detto:. Segnali e tubi

Non deve essere troppo complesso, ma sarà un diavolo di molto più facile se si utilizza una struttura esistente che se si tenta di ripristinare il proprio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top