<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br>
<br><div><div>Il giorno Dec 10, 2011, alle ore 12:51 PM, enrico franchi ha scritto:</div><br class="Apple-interchange-newline"><blockquote type="cite">2011/12/10 Massimo Di Stefano <span dir="ltr"><<a href="mailto:massimodisasha@gmail.com">massimodisasha@gmail.com</a>></span><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div style="word-wrap:break-word">Ciao Henryx,</div></blockquote><div><br></div><div>Credo che tu ti stia confondendo con un mio omonimo.  </div></div></blockquote><div><br></div><div>Scusami per la confusione, non me ne voglia il vero Henryx ;)</div><br><blockquote type="cite"><div class="gmail_quote"><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div style="word-wrap:break-word"><div></div><div>premetto che tutto quello che so di computer e python … l'ho imparato grazie a voi (comunità')</div><div>purtroppo non ho studiato informatica e di sicuro ho tutto da imparare da questa discussione.</div>

<div><br></div><div>Non ho esperienza tale da capire come funzionano i thread,  ho difficoltà' a capire come funzionano i look e metodi associati ad esso, cosa sia una queue e come la si usa</div><div>sto provando ad imparare … autodidatta, ma ci sto provando.</div>

</div></blockquote><div><br></div><div>Dai pero' almeno i lock chiamali con i loro nomi! In due post non hai manco azzeccato il nome :P</div></div></blockquote><br><div>bold(:-P)   </div><br><blockquote type="cite"><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div style="word-wrap:break-word"><div><br></div><div>nella maggior parte dei casi tutti mi dicono che i thread siano "il male", a me pare che invece "risolvano problemi".</div></div></blockquote><div>

<br></div><div>Risolvono problemi. Ma ne creano piu' di quelli che risolvono. Per esempio, finche' non capisci *bene* come usare i lock stai facendo l'equivalente computeristico di buttarti in un incrocio senza guadare se arriva qualcuno. prima o poi ciocchi.</div></div></blockquote><div><br></div><div><br></div><div>qui la mia ignoranza regna sovrana .. per ora ho visto che invece di 50 secondi, il download e processing dei singoli file di testo termina in 4 secondi.</div><div>da quanto ho capito le operazioni effettuate dai threads nel mio caso  sono indipendenti l'una dall'altra, il ciocco potrebbe avvenire server side per un overload di richieste di download forse ?</div><div>in questo caso farei bene ad aggiungere un check per controllare se il file scaricato contiene effettivamente i dati … (maybe) </div><br><blockquote type="cite"><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word"><div><div><div>vero se decido di usare brew, port fink o altro</div><div>

quindi un potenziale user sarebbe "costretto" </div><div>ad installarsi xcode, brew (ottimo) .. o altro port/fink rtc etc ...</div><div>certo non e' la fine del mondo, ma …  di sicuro non e' la soluzione ottimale se devo far usare lo script a terze persone.</div>

</div></div></div></blockquote><div><br></div><div>Questo e' in essenza un falso problema. Male che vada dai due botte di pyinstaller.</div><div>Altrimenti specifichi le dipendenze e se uno vuole usare un software se le scarica. I miracoli non li puoi fare.</div></div></blockquote><div><br></div><div>su osx il problema grosso e Xcode … e' immenso e richiede registrazione, un'alternativa potrebbe essere : </div><div><br></div><div><a href="https://github.com/kennethreitz/osx-gcc-installer">https://github.com/kennethreitz/osx-gcc-installer</a></div><div><br></div><div>ma non l'ho mai provato</div><div><br></div><br><blockquote type="cite"><div class="gmail_quote">

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word"><div><div><div>un altro problema riscontrato sone errori e velocita'</div>

<div>quando il numero di file da scaricare (sono tutti di pochi kbyte) </div><div>aumenta, thread si prende un bel margine se comparato con gevent.</div><div>nei test che sto provando i file sono 25</div><div>thread per leggere scaricare e processare i file di testo ci mette circa 5 secondi, gevent 18</div>

</div></div></div></blockquote><div><br></div><div>Tutto questo e' controintuitivo. Mi sarei aspettato il contrario.</div></div></blockquote><div><br></div><div><br></div><div>non so che dirti .. provare per credere ?</div><div><br></div><br><blockquote type="cite"><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div style="word-wrap:break-word"><div><div><div>ma il problema più grande e' che gevent una volta su 10 mi da un I/O error</div><div>penso sia dovuto alla rete (per fare i test ho dovuto fermare il download di alcuni torrent che mi saturavano la banda) </div>

<div>cosi' facendo gli errori sono diminuiti .. ma non scomparsi.</div></div></div></div></blockquote><div><br></div><div>Ho un'idea sul perche': direi che la libreria di torrent non "gioca carino".</div>

<div>Bisognerebbe andare dentro a vedere.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word"><div><div><div></div><div>

l'utilizzo di thread non da questo problema.</div><div class="im"><div><br></div></div></div></div></div></blockquote><div><br></div><div>Mancano dettagli specifici. Se ti va bene, sei praticamente in shared nothing e non dovresti avere problemi con i threads. Mi aspetterei tuttavia delle performance non particolarmente superiori al caso sequenziale. </div></div></blockquote><div><br></div><div>scaricare sequenzialmente</div><div><br></div><div>for i in mylink list</div><div>    download and save i</div><div><br></div><div>impiega 40 secondi circa</div><div>usando i threads 4 secondi e mezzo</div><div><br></div><div>io ci vedo u a differenza enorme 10x</div><div><br></div><br><blockquote type="cite"><div class="gmail_quote">

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word"><div><div><div>ho scoperto gevent da 2 giorni grazie a tyrion-mx [grazie!] </div>

<div>sto leggendo la documentazione, e' davvero bello e non ne sapevo l'esistenza … le coroutine sembrano qualcosa di magico.</div></div></div></div></blockquote><div><br></div><div>Non lo sono, in realta'. E' molto simile a come ciascuno di noi gestisce la concorrenza. </div>

<div>E' anche intuitivo: sai fare tante cose insieme una per volta. Ma se non ti interrompi ogni tanto, non le fai tutte insieme, ma vai avanti a farne sempre una.</div></div></blockquote><div><br></div><div>l'universo della programmazione e' semplicemente affascinante! </div><div><br></div><div><br></div><div>preso da un atroce dubbio .. ho provato a lanciare lo stesso identico codice [1]</div><div> da dentro ipython … invece di usare mela+r  in textmate (un editor per osx)</div><div><br></div><div>e magicamente tutto funziona …</div><div><br></div><div><div>>>> from testthread import download</div><div>>>> lista = []</div><div>>>> sitecodelist = ["01046500", "01018500", "01010500", "01034500", "01059000", "01066000", "01100000"]</div><div>>>> for k in sitecodelist:</div><div>...     get_data = download(k,lista)</div><div>...     get_data.start()</div><div>... </div><div>>>> loaded Monthly data for sitecode :  01010500</div><div>loaded Monthly data for sitecode :  01018500</div><div>loaded Monthly data for sitecode :  01046500</div><div>loaded Monthly data for sitecode :  01059000</div><div>loaded Monthly data for sitecode :  01100000</div><div>loaded Monthly data for sitecode :  01066000</div><div>loaded Monthly data for sitecode :  01034500</div><div><br></div><div>>>> lista</div><div>['/var/folders/sg/gwygncln7zj2dv1s6dmrkjj40000gn/T/tmpsPY8tT', '/var/folders/sg/gwygncln7zj2dv1s6dmrkjj40000gn/T/tmpNwHBiy', '/var/folders/sg/gwygncln7zj2dv1s6dmrkjj40000gn/T/tmpiYW1EQ', '/var/folders/sg/gwygncln7zj2dv1s6dmrkjj40000gn/T/tmp9P3VfF', '/var/folders/sg/gwygncln7zj2dv1s6dmrkjj40000gn/T/tmp46hdX3', '/var/folders/sg/gwygncln7zj2dv1s6dmrkjj40000gn/T/tmpofXc5Q', '/var/folders/sg/gwygncln7zj2dv1s6dmrkjj40000gn/T/tmphtpLrm']</div><div>>>> </div><div><br></div><div>ora sono felice … ma perplesso</div></div><div><br></div><div><br></div><div><br></div><div>- Massimo</div><div><br></div><div><br></div><div><br></div><div>[1]</div><div><br></div><div># testthread.py #</div><div><br></div><div><div>import threading</div><div>import urllib</div><div>from tempfile import NamedTemporaryFile</div><div><br></div><div>class download(threading.Thread):</div><div>    def __init__(self, sitecode, lista):</div><div>        threading.Thread.__init__(self)</div><div>        self.sitecode = sitecode</div><div>        self.status = -1</div><div>        self.lista = lista</div><div><span class="Apple-tab-span" style="white-space:pre">           </span></div><div>    def run(self):</div><div>        url = "<a href="http://waterdata.usgs.gov/nwis/monthly?referred_module=sw&site_no=">http://waterdata.usgs.gov/nwis/monthly?referred_module=sw&site_no=</a>"</div><div>        url += self.sitecode </div><div>        url += "&PARAmeter_cd=00060&partial_periods=on&format=rdb&submitted_form=parameter_selection_list"</div><div>        tmp = NamedTemporaryFile(delete=False)</div><div>        urllib.urlretrieve(url, tmp.name)</div><div>        print "loaded Monthly data for sitecode : ",  self.sitecode </div><div>        self.lista.append(tmp.name)</div><div><br></div></div></div></body></html>