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

Massimo Di Stefano massimodisasha a gmail.com
Ven 9 Dic 2011 21:18:37 CET


Ciao,

sto provando ad imparare ad usare la libreria thread … ma ho dei problemi :-( 

il mio obiettivo e'  il download di alcuni file da internet con urlib 
salvarli in un file temporaneo 
e scrivere in una lista il path di tali file.

is codice di seguito, e'  scarica i file e li salva come file temporanei
… ma non riesco a capire come salvarne una lista dei path.

########################################################################################
# thread test

import threading
import urllib
from tempfile import NamedTemporaryFile

class download(threading.Thread):
    def __init__(self, sitecode):
        threading.Thread.__init__(self)
        self.sitecode = sitecode
        self.status = -1
		
    def run(self):
        #global filelist
        #filelist = []
        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 
        #filelist.append(tmp.name)
        #return filelist
		


sitecodelist = ['01046500', '01018500', '01010500', '01034500', '01059000', '01066000', '01100000']

for k in sitecodelist:
    get_data = download(k)
    get_data.start()

########################################################################################

per gevent il seguente codice funziona e mi restituisce :


########################################################################################
# gevent test

import gevent
from gevent import monkey
import urllib
from tempfile import NamedTemporaryFile


def gen_data(sitecode, listapath):
    url1 = 'http://waterdata.usgs.gov/nwis/monthly?referred_module=sw&site_no='
    url1 += sitecode
    url1 += '&PARAmeter_cd=00060&partial_periods=on&format=rdb&submitted_form=parameter_selection_list'
    tmp1 = NamedTemporaryFile(delete=False)
    urllib.urlretrieve(url1, tmp1.name)
    listapath.append(tmp1.name)



sitecodelist = ['01046500', '01018500', '01010500', '01034500', '01059000', '01066000', '01100000']
lista = []

monkey.patch_all()
jobs = [gevent.spawn(gen_data, sitecode, lista) for sitecode in sitecodelist]
gevent.joinall(jobs)

print lista
############################################################################################


ho provato a passare un lista vuota come input e farne l'append durante l'esecuzione dei trheads .. ma sono lontano anni luce dal farlo funzionare.

ho provato ad usare la libreria gevent e con essa riesco a salvare la suddetta lista … ma mi introduce ulteriori dipendenze 
(su linux nn sono un problema, ma su osx richiede di installare la libreria event da sorgente (non ho trovato binary), per poi installare gevent usando easy_install)


potete aiutarmi a comprendere come utilizzare la libreria thread in modo da restituirmi dei valori da salvare in un oggetto python (oin questo caso una lista di path) ?

grazie mille per qualsiasi aiuto!

Massimo.



Maggiori informazioni sulla lista Python