[Python] thread e subprocess
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. grazie in anticipo: [CODE] #!/usr/bin/env python2.7 # import subprocess as sp import threading as thr try: import queue except ImportError: import Queue as queue def run_command(qq, args): try: _cmd = list(args) _userid = _cmd[1] _proc = sp.Popen(_cmd, stdout=sp.PIPE, stderr=sp.PIPE) (_stdout, _stderr) = _proc.communicate() qq.put(' *** %s ***\n\n[STDOUT]: %s\n[STDERR]: %s\n\n *** END ***\n\n' % ( _userid, _stdout, _stderr,)) except Exception as err: log.error('errore %s: %s' % (_userid, str(err))) qq.put(' *** %s ***\n\n[ERRORE]: %s\n\n *** END ***\n\n' % ( _userid, str(err),)) finally: qq.task_done() def run_unison(clients, qq, args): _act = 0 for k, v in clients.items(): for scr in v['server']: _cmd = [ 'ssh', '%s@%s' % (k, v['host'],), '"/Users/%s/bin/%s_%s.command"' % (k, k, scr,) ] + _extra_params t = thr.Thread(target=run_command, args=(qq, _cmd)) t.start() _act += 1 print(' ') while _act > 0: _out_qq = qq.get() print(_out_qq.decode('utf8')) _act -= 1 if __name__ == '__main__': qq = queue.Queue() run_unison(_cli, qq, args) [CODE] -- Never try to teach a pig to sing. It wastes your time and annoys the pig. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] thread e subprocess
* 29/10/2014, Daniele Varrazzo wrote : > Preparati, perche' ora si scatena la flame war che scatta > automaticamente quando qualcuno pronuncia la parola "thread". lungi da me ! ;-) cmq cercando su internet ho trovato tutto e il contrario di tutto, ma mai precisamente quello che serviva a me. > Penso vada "abbastanza" bene, perche' non hai race condition: _act viene > comunque gestito solo dal thread principale. ok > 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. questo posso provare a farlo. ma il join lo mettersti DOPO aver lanciato i singoli thread ? cioe' qualcosa del genere: [CODE] _ths = [] for k, v in clients.items(): for scr in v['server']: _cmd = [ 'ssh', '%s@%s' % (k, v['host'],), '"/Users/%s/bin/%s_%s.command"' % (k, k, scr,) ] + _extra_params _ths.append(thr.Thread(target=run_command, args=(qq, _cmd))) _ths[-1].start() for _th in _ths: _th.join() [/CODE] > 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(): ah ok ! ho letto malissimo io :-| > 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. tieni conto che sono degli script da lanciare ogni 10/15 minuti su dei Mac (con un lock in locale che impedisce di lanciare piu' volte lo script) quindi niente di trascendentale. cmq adesso ci provo a fare le correzioni che hai detto, e se ho altre domande mi faccio risentire. grazie mille per le spiegazioni ! saluti P.S. non uso cron sui Mac perche' dalla 10.8 in poi e' stato "inglobato" in launchd e, praticamente, non funziona, senza nessun segnale nei log :-( -- Never try to teach a pig to sing. It wastes your time and annoys the pig. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] thread e subprocess
* 29/10/2014, Daniele Varrazzo wrote : > Io ne posso pure tenere conto :) Ti spiego solo che finche' l'input e` > contenuto il programma ancora ancora funziona, ma resta uno script che a > fronte di un input di dimensioni impreviste avrebbe un'occupazione > illimitata di risorse. Sta a te "tenerne conto" :) Se hai gli elementi > per essere sicuro che "non succedera` maimaimaimai" puoi tenerlo com'e`, > oppure puoi renderlo robusto a fronte di imprevisti (e imparare a > coordinare un pool di workers con una queue, che e' un pattern molto > utile). ok ... con la list ed il join funziona alla perfezione. poi magari mi guardo anche i consigli di manlio. grazie ancora -- Never try to teach a pig to sing. It wastes your time and annoys the pig. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] thread e subprocess
* 29/10/2014, Manlio Perillo wrote : > 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. > >Nel codice del thread ti suggerisco di usare la funzione >subprocess.check_output. >In generale io proverei ad usare multiprocessing.Pool ed il metodo map. con map avevo "problemi" a passare i parametri, se nn mi sbaglio. adesso che l'ho fatto girare magari ci perdo un po' piu' di tempo. >Purtroppo non esiste l'analogo Pool nel modulo threading, però da una >veloce ricerca è venuta fuori questa "sorpresa": >[2]http://stackoverflow.com/questions/3033952/python-thread-pool-simila >r-to-the-multiprocessing-pool >>>> from multiprocessing.pool import ThreadPool >usando ThreadPool.map il tuo codice diventa molto più semplice ed >inoltre non soffri del problema che ti ha segnalato Daniele su troppi >processi/thread in esecuzione. adesso vedo anche questo. >Se sei curioso esiste anche una alternativa senza usare un thread o >processo di supporto, ma è più complesso e non trovi nulla di pronto >nella stdlib (forse qualcosa in Python 3.x). curioso sarei curioso ... cosa dovrei guardare ? grazie e ciao -- Never try to teach a pig to sing. It wastes your time and annoys the pig. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] thread e subprocess
* 29/10/2014, Manlio Perillo wrote : >Quindi devi fare tutto a mano, ossia lanciare i processi con subprocess >(o fork + exec) e poi usare select/poll per verificare quando ci sono >dei dati da leggere dallo stdout di ciascun processo, accumulando i >dati in un buffer.à Se sei su Windows sono guai, ma si può fare anche >se in modo diverso. i server sono Linux. grazie mille. me la studio un po' -- Never try to teach a pig to sing. It wastes your time and annoys the pig. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] thread e subprocess
* 30/10/2014, Manlio Perillo wrote : >Nel tuo caso non credo valga la pena, a meno di avere un centinaio di >client e vuoi avere un alto livello di concorrenza. >Certo, evitare di usare thread e fork nello stesso programma è una >buona cosa: eh infatti. magari non lo applico direttamente adesso, ma averne un idea per trovarmi eventualmente preparato in futuro non sarebbe male. saluti -- Never try to teach a pig to sing. It wastes your time and annoys the pig. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] thread e subprocess
* 29/10/2014, Manlio Perillo wrote : volevo ringraziare Manlio e Daniele per i consigli. alla fine ho risolto con il multiprocessing ThreadPool; codice piu' pulito, lineare, leggibile e sicuro. saluti -- Never try to teach a pig to sing. It wastes your time and annoys the pig. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Io lo so che coem sistemista faccio schifo
* 19/03/2015, Carlos Catucci wrote : >pero' che due maroni. >Ho sempre usato hosting (tipo Alwaysdata) che mi danno la possibilita' >di deployare un progetto Django senza dover impazzie troppo. Al massimo >richiedono una specigfica struttura nell'albero delel directories, tipo >mettere static in root del progetto oppure nelal cartella dove riside >anche settings.py, per dire. >Stavolta devo deployare su un server su cui o pieno accesso. >Primo tentativo: nginx+uwsgi. Non va neppure se lo prendo a calci sui >denti. io uso nginx+uwsgi (emperor) con piu' webapp Pylons+Pyramid e funziona; ti passo di seguito un esempio di configurazione; il file .ini e' lo standard Pylons/Pyramid. nginx: server { ... location / { include /etc/nginx/uwsgi_params; uwsgi_param SCRIPT_NAME ''; uwsgi_read_timeout 180; uwsgi_pass_request_headers on; uwsgi_pass 127.0.0.1:5011; } } uwsgi_params: uwsgi_param QUERY_STRING $query_string; uwsgi_param REQUEST_METHOD $request_method; uwsgi_param CONTENT_TYPE $content_type; uwsgi_param CONTENT_LENGTH $content_length; uwsgi_param REQUEST_URI$request_uri; uwsgi_param PATH_INFO $document_uri; uwsgi_param DOCUMENT_ROOT $document_root; uwsgi_param SERVER_PROTOCOL$server_protocol; uwsgi_param HTTPS $https if_not_empty; uwsgi_param UWSGI_SCHEME $scheme; uwsgi_param REMOTE_ADDR$remote_addr; uwsgi_param REMOTE_PORT$remote_port; uwsgi_param SERVER_PORT$server_port; uwsgi_param SERVER_NAME$server_name; uwsgi: 0.0.0.0:5011 python27 utentemio utentemio /home/utentemio/projects true 4 180 1000 true /home/utentemio/projects/acme/acme.ini /home/utentemio/projects/acme PYTHON_EGG_CACHE=/home/utentemio/tmp /home/utentemio/projects/acme /home/utentemio/.local/lib/python2.7/site-packages /home/utentemio/projects/lib/python2.7/site-packages /usr/lib/python2.7/site-packages -- Never try to teach a pig to sing. It wastes your time and annoys the pig. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] genropy for dummy
salve a tutti, scusate la domanda forse banale ... uso Pylons/Pyramid per le mie webapp e stavo cercando di capire se genropy facesse al caso mio per futuri utilizzi. mi sono perso completamente (certamente per mia ignoranza) nella documentazione. ho creato il project ecc ecc ma la mia domanda e': come faccio a mappare una url ad un file python ? in Pylons/Pyramid ho il controller/action ... come funziona in genropy ? se qualcuno ha un link a qualche spiegazione piu' "terra terra" mi farebbe un grosso favore postandomelo. grazie anticipate -- Never try to teach a pig to sing. It wastes your time and annoys the pig. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] autenticazione windows
* 14/03/2014, Lorena Doria wrote : >ciao, >è utilissima e fa proprio al caso mio, però ho il problema che io devo >usare python 2.5 che non supporta la funzione "with" come posso ovviare >al problema? >Grazie 1 http://legacy.python.org/dev/peps/pep-0343/ Transition Plan In Python 2.5, the new syntax will only be recognized if a future statement is present: from __future__ import with_statement This will make both 'with' and 'as' keywords. Without the future statement, using 'with' or 'as' as an identifier will cause a Warning to be issued to stderr. -- Never try to teach a pig to sing. It wastes your time and annoys the pig. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Come pubblico il mio progetto django?
* 05/04/2014, Gollum1 wrote : > Ciao Lista, > > Sto studiando qualcosa di django (tempo tiranno permettendo), ma > quello che non riesco a capire, è come pubblico poi il mio progetto? > > quello che non riesco a capire è come dire ad apache di usare python > come interprete. da qualche parte leggo di usare mod-python (ma viene > indicato come problematico in diversi forum), come ho trovato anche un > altro modulo, che ora non ricordo più... non uso Django ma Pylons/Pyramid, e nn uso apache ma nginx. se nn vuoi mettere mano su apache per evitare problemi, installa uwsgi e nginx e segui qualche tutorial tipo: http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html nn ci ho piu' provato, ma nn avendo php da mettere online ho lasciato apache perche' mi aveva dato problemi con mod_python. con nginx+uwsgi e' stato molto piu' semplice. saluti -- Never try to teach a pig to sing. It wastes your time and annoys the pig. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Mac osx e cartella site-packages
* 06/06/2014, Daniele Zambelli wrote : > Salve a tutti, > > In un corso che sto tenendo ho dei colleghi che possiedono un Mac, ma > io non lo conosco per niente, potreste dirmi dove si trova la cartella > dove mettere le librerie, quella che in Windows è site-packages o in > Linux dist-packages? macosx e' "tipo" unix ... se devi copiare librerie e non installarle, vai in utility e apri il terminale. ti si apre nella home directory dell'utente loggato. crea (presumendo tu voglia utilizzare la 2.7) .local/lib/python2.7/site-packages e copiaci le lib dentro. poi negli script eventualmente aggiungi all'inizio import os, sys sys.path.append(os.path.join(os.environ['HOME'], '.local/lib/python2.7/site-packages')) import tualib ciao ... spero di aver capito la domanda. -- Never try to teach a pig to sing. It wastes your time and annoys the pig. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Oggi la Packt regala un libro su Python [Modern Python Cookbook]
* 05/06/2017, Francesco Maida wrote : thx ... ho comprato un libro giusto 2 gg fa :) -- Never try to teach a pig to sing. It wastes your time and annoys the pig. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python