[Python] python threads, how to store results from a multithread code

Massimo Di Stefano massimodisasha a gmail.com
Sab 10 Dic 2011 20:33:35 CET



Il giorno Dec 10, 2011, alle ore 12:51 PM, enrico franchi ha scritto:

> 2011/12/10 Massimo Di Stefano <massimodisasha a gmail.com>
> Ciao Henryx,
> 
> Credo che tu ti stia confondendo con un mio omonimo.  

Scusami per la confusione, non me ne voglia il vero Henryx ;)

> 
> 
> premetto che tutto quello che so di computer e python … l'ho imparato grazie a voi (comunità')
> purtroppo non ho studiato informatica e di sicuro ho tutto da imparare da questa discussione.
> 
> 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
> sto provando ad imparare … autodidatta, ma ci sto provando.
> 
> Dai pero' almeno i lock chiamali con i loro nomi! In due post non hai manco azzeccato il nome :P

bold(:-P)   

>  
> 
> nella maggior parte dei casi tutti mi dicono che i thread siano "il male", a me pare che invece "risolvano problemi".
> 
> 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.


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.
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 ?
in questo caso farei bene ad aggiungere un check per controllare se il file scaricato contiene effettivamente i dati … (maybe) 

>  
> vero se decido di usare brew, port fink o altro
> quindi un potenziale user sarebbe "costretto" 
> ad installarsi xcode, brew (ottimo) .. o altro port/fink rtc etc ...
> certo non e' la fine del mondo, ma …  di sicuro non e' la soluzione ottimale se devo far usare lo script a terze persone.
> 
> Questo e' in essenza un falso problema. Male che vada dai due botte di pyinstaller.
> Altrimenti specifichi le dipendenze e se uno vuole usare un software se le scarica. I miracoli non li puoi fare.

su osx il problema grosso e Xcode … e' immenso e richiede registrazione, un'alternativa potrebbe essere : 

https://github.com/kennethreitz/osx-gcc-installer

ma non l'ho mai provato


>  
> un altro problema riscontrato sone errori e velocita'
> quando il numero di file da scaricare (sono tutti di pochi kbyte) 
> aumenta, thread si prende un bel margine se comparato con gevent.
> nei test che sto provando i file sono 25
> thread per leggere scaricare e processare i file di testo ci mette circa 5 secondi, gevent 18
> 
> Tutto questo e' controintuitivo. Mi sarei aspettato il contrario.


non so che dirti .. provare per credere ?


>  
> ma il problema più grande e' che gevent una volta su 10 mi da un I/O error
> penso sia dovuto alla rete (per fare i test ho dovuto fermare il download di alcuni torrent che mi saturavano la banda) 
> cosi' facendo gli errori sono diminuiti .. ma non scomparsi.
> 
> Ho un'idea sul perche': direi che la libreria di torrent non "gioca carino".
> Bisognerebbe andare dentro a vedere.
>  
> l'utilizzo di thread non da questo problema.
> 
> 
> 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. 

scaricare sequenzialmente

for i in mylink list
    download and save i

impiega 40 secondi circa
usando i threads 4 secondi e mezzo

io ci vedo u a differenza enorme 10x


>  
> ho scoperto gevent da 2 giorni grazie a tyrion-mx [grazie!] 
> sto leggendo la documentazione, e' davvero bello e non ne sapevo l'esistenza … le coroutine sembrano qualcosa di magico.
> 
> Non lo sono, in realta'. E' molto simile a come ciascuno di noi gestisce la concorrenza. 
> 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.

l'universo della programmazione e' semplicemente affascinante! 


preso da un atroce dubbio .. ho provato a lanciare lo stesso identico codice [1]
 da dentro ipython … invece di usare mela+r  in textmate (un editor per osx)

e magicamente tutto funziona …

>>> from testthread import download
>>> lista = []
>>> sitecodelist = ["01046500", "01018500", "01010500", "01034500", "01059000", "01066000", "01100000"]
>>> for k in sitecodelist:
...     get_data = download(k,lista)
...     get_data.start()
... 
>>> loaded Monthly data for sitecode :  01010500
loaded Monthly data for sitecode :  01018500
loaded Monthly data for sitecode :  01046500
loaded Monthly data for sitecode :  01059000
loaded Monthly data for sitecode :  01100000
loaded Monthly data for sitecode :  01066000
loaded Monthly data for sitecode :  01034500

>>> lista
['/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']
>>> 

ora sono felice … ma perplesso



- Massimo



[1]

# testthread.py #

import threading
import urllib
from tempfile import NamedTemporaryFile

class download(threading.Thread):
    def __init__(self, sitecode, lista):
        threading.Thread.__init__(self)
        self.sitecode = sitecode
        self.status = -1
        self.lista = lista
		
    def run(self):
        url = "http://waterdata.usgs.gov/nwis/monthly?referred_module=sw&site_no="
        url += self.sitecode 
        url += "&PARAmeter_cd=00060&partial_periods=on&format=rdb&submitted_form=parameter_selection_list"
        tmp = NamedTemporaryFile(delete=False)
        urllib.urlretrieve(url, tmp.name)
        print "loaded Monthly data for sitecode : ",  self.sitecode 
        self.lista.append(tmp.name)

-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20111210/989975d5/attachment.html>


Maggiori informazioni sulla lista Python