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

Rispondere a