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
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python