2012-11-30 19 views
5

मेरे पास लिंक की एक स्ट्रीम आ रही है, और मैं उन्हें हर समय rss के लिए जांचना चाहता हूं। लेकिन जब मैं अपने get_rss() फ़ंक्शन को बंद करता हूं, तो यह ब्लॉक करता है और स्ट्रीम रोकता है। यह अनावश्यक है, और मैं बस get_rss() समारोह के बारे में फायर-एंड-भूल करना चाहते हैं (बल्कि उसके परिणामों कहीं और संग्रहीत करता है।)उत्तर के लिए प्रतीक्षा किए बिना फायर ऑफ फ़ंक्शन (पायथन)

मेरे कोड है इस प्रकार की तरह:

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

(...) 

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

मुझे लगता है कि सोच रहा हूँ अगर मैं पहली कॉल को फायर-एंड-भूल सकता हूं, तो मैं इसके बारे में चिंतित होने के बारे में urllib2 का उपयोग भी कर सकता हूं क्योंकि यह एसिंक नहीं है। किसी भी प्रकार की मदद की बेहद सराहना की जाती है!

संपादित करें: gevent बाहर की कोशिश कर रहा है, लेकिन इस तरह कुछ भी नहीं होता है:

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 

Greenlet पंजीकृत होने के लिए लगते हैं, लेकिन समारोह self.ff.do_url(url) बिल्कुल चलाने के लिए प्रतीत नहीं होता। मैं क्या गलत कर रहा हूं?

+0

सूत्रण अपने दोस्त – zenpoy

+0

है लेकिन यह है कि एक सा ज्यादा हर, कहते हैं, दूसरा एक नया धागा शुरू करने के लिए नहीं है? – knutole

+1

नहीं, यह नहीं है, लेकिन आपको इसकी आवश्यकता नहीं है, आप 3 धागे को फायर कर सकते हैं और एक सामान्य कतार के बावजूद उन्हें यूआरएल जमा कर सकते हैं। –

उत्तर

2

आप या तो database, एक फ़ाइल या एक queue में threading मॉड्यूल या multiprocessing मॉड्यूल परिणाम का उपयोग करें और बचाने के लिए चाहते हैं।

आप gevent का भी उपयोग कर सकते हैं।

+0

मैं इसे gevent के साथ कैसे लिख सकता हूं? – knutole

+0

वास्तव में आपके उत्तर की सराहना करते हैं। लेकिन मैं उपरोक्त gevent के साथ अटक गया हूँ। कोई विचार? धन्यवाद। – knutole

3

आग और बहु ​​मॉड्यूल का उपयोग कर भूल जाते हैं:

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" 
संबंधित मुद्दे