[Python] thread e subprocess

Daniele Varrazzo piro a develer.com
Mer 29 Ott 2014 15:26:45 CET


On 2014-10-29 13:52, Antonio Conte wrote:
> salve a tutti,
> 
> sto lavorando su uno script che lancia su piu' client un comando. per 
> il
> momento sto usando subprocess, ma volevo lanciare i processi in 
> parallelo
> e ricavare l'output mano a mano che i processi terminano.
> 
> tenete conto che lo script va lanciato da cron, e mi serve l'output del 
> comando
> per inviarlo via mail.
> 
> dopo varie prove sono arrivato a questo, ma mi chiedevo se fosse il 
> modo giusto
> (cioe' l'utilizzo del contatore _act) per aspettare che tutti i 
> processi
> terminino e per leggere dalla queue l'output.

Preparati, perche' ora si scatena la flame war che scatta 
automaticamente quando qualcuno pronuncia la parola "thread".

Penso vada "abbastanza" bene, perche' non hai race condition: _act viene 
comunque gestito solo dal thread principale.

Un modo di coordinarsi piu` robusto sarebbe quello di usare Thread.join, 
ma come avrai gia` scoperto questo ti impedirebbe di avere un output 
graduale nel thread principale. Lo puoi usare se eviti la print nel loop 
principale: lanci prima tutti i processi nei thread separati, poi 
t.join() per ogni thread.

Nel tuo codice, qq.task_done() non credo ti serva a niente: quello serve 
se es. il thread principale chiamasse qq.put() e poi qq.join() ed avessi 
un pool di worker thread che chiamassero qq.get() e qq.task_done(): 
cosi' potresti avere es. un pool di workers a lavoro in round-robin 
sulla coda dei compiti (es. 10 processi a lavoro su 100 compiti). Tu 
invece hai un mapping 1-1 tra processi e compiti e solo una coda di 
risultati: la tua struttura e' piu' semplice ma probabilmente scala 
peggio: se avessi 1000 compiti da fare la tua macchina non sarebbe molto 
felice di lanciare 1000 thread + 1000 processi tutti insieme.


-- Daniele


Maggiori informazioni sulla lista Python