[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