[Python] thread e subprocess

2014-10-29 Per discussione Antonio Conte
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

2014-10-29 Per discussione Antonio Conte
* 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

2014-10-29 Per discussione Antonio Conte
* 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

2014-10-29 Per discussione Antonio Conte
* 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

2014-10-29 Per discussione Antonio Conte
* 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

2014-10-30 Per discussione Antonio Conte
* 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

2014-10-31 Per discussione Antonio Conte
* 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

2015-03-19 Per discussione Antonio Conte
* 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

2015-12-04 Per discussione Antonio Conte
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

2014-03-14 Per discussione Antonio Conte
* 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?

2014-04-05 Per discussione Antonio Conte
* 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

2014-06-06 Per discussione Antonio Conte
* 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]

2017-06-05 Per discussione Antonio Conte
* 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