[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