2012-11-30 12 views
5

Ho un flusso di link in arrivo, e voglio controllarli per rss di tanto in tanto. Ma quando sparo la mia funzione get_rss(), blocca e il flusso si arresta. Questo è inutile, e mi piacerebbe solo fire-and-forget sulla funzione get_rss() (memorizza i propri risultati altrove.)Funzione di spegnimento senza attendere risposta (Python)

Il mio codice è come così:

self.ff.get_rss(url) # not async 
print 'im back!' 

(...) 

def get_rss(url): 
    page = urllib2.urlopen(url)  # not async 
    soup = BeautifulSoup(page) 

sto pensando che se posso licenziare e dimenticare la prima chiamata, allora posso anche usare urllib2 senza preoccuparmi che non sia asincrona. Ogni aiuto è molto apprezzato!

Edit: Provare gevent, ma come questo non succede nulla:

print 'go' 
g = Greenlet.spawn(self.ff.do_url, url) 
print g 
print 'back' 

# output: 
go 
<Greenlet at 0x7f760c0750f0: <bound method FeedFinder.do_url of <rss.FeedFinder object at 0x2415450>>(u'http://nyti.ms/SuVBCl')> 
back 

La Greenlet sembrano essere registrata, ma la funzione self.ff.do_url(url) non sembra essere funzionare affatto. Che cosa sto facendo di sbagliato?

+0

threading è tuo amico – zenpoy

+0

, ma non è che un po 'troppo per iniziare un nuovo thread ogni, diciamo, secondo? – knutole

+1

No non lo è, ma non è necessario, è possibile attivare 3 thread e inviare URL a loro anche se una coda comune. –

risposta

2

si desidera utilizzare il modulo o il modulo threadingmultiprocessing e salvare il risultato sia in database, un file o un queue.

È inoltre possibile utilizzare gevent.

+0

Come posso scrivere con gevent? – knutole

+0

Apprezzo davvero la tua risposta. Ma sono bloccato con gevent sopra. Qualche idea? Grazie. – knutole

3

Fuoco e dimenticare utilizzando il modulo multiprocessing:

def fire_and_forget(arg_one): 
    # do stuff 
    ... 

def main_function(): 
    p = Process(target=fire_and_forget, args=(arg_one,)) 
    # you have to set daemon true to not have to wait for the process to join 
    p.daemon = True 
    p.start() 
    return "doing stuff in the background"