2012-10-22 9 views
5

Sto per avviare un programma utilizzando Python che esegue principalmente il polling, leggerà costantemente dalla porta seriale (tramite PySerial) e leggerà da un descrittore di file che cambierà da tempo a tempo. Ho iniziato a esaminare il modulo threading ma poi ho continuato a trovare i suggerimenti more e more per l'utilizzo del modulo multiprocessing.thread vs. process in Python

Non sono esperto in Python, proveniente da uno sfondo prevalentemente C. Quali sono i vantaggi tecnici di un approccio thread in Python?

In C, i thread condividono i dati e devono configurare un IPC per comunicare, che sembra essere lo stesso per Python?

mio caso d'uso:

Main process (or thread?) - 
    start & initialize 
     | 
     V 
    spaw child----------------------> start & initialize 
     |         | 
     V         V 
     while (1) <------------+   wait for data<------+ 
     |      |    |    | 
     V      |    V    | 
    read file descriptors  |   read from   | 
     |      |   serial port<-----+ | 
     V      |    |   | | 
    value changed? ------No--+    V   | | 
     |     ^  message done?--No-+ | 
     V      |    |    | 
    Report change------------+    V    | 
    over serial      alert parent---------+ 

Stavo pensando discussioni, in quanto renderà la condivisione dei dati ottenuto su seriale più facile, e possono avere una maniglia condiviso alla porta seriale. Ha senso, o sto pensando erroneamente da un punto di vista pitonico?

+1

Il multiprocessing è un modo (IMHO piuttosto goffo) di aggirare il GIL. In questo caso, penso che 'threading' sia la strada da percorrere. – mgilson

+0

@Downvoter - Potrei avere una ragione per cui senti questa domanda: "non mostra uno sforzo di ricerca, non è chiaro o non è utile"? – Mike

risposta

11

multiprocessing viene utilizzato principalmente in Python per evitare il GIL (Global Interpreter Lock), che impedisce ai thread di essere utili per il calcolo in parallelo, per l'accesso alle risorse, i thread sono perfetti e l'opzione migliore per semplificare l'implementazione.

GIL significa che solo un thread può operare su qualsiasi oggetto Python allo stesso tempo. Ciò significa che dove stai cercando di accelerare i calcoli, i processi saranno ostacolati dagli altri thread. Nel tuo caso d'uso, un thread controllerà il nuovo input, quindi questo non causerà alcun problema.

+0

Risposta stupenda, grazie. Penso di aver bisogno di esaminare il GIL un po 'di più. Questo è un nuovo concetto per me. – Mike

+2

È un dettaglio di implementazione di CPython a cui le persone sono davvero impiccate: nel 99% dei casi, non importa. –