2012-11-30 18 views
5

我有一串链接进来,我想不时检查它们是否为rss。但是,当我启动我的get_rss()函数时,它会阻塞并且流停止。这是不必要的,我想刚刚发射后不管有关get_rss()功能(在其他地方保存它的结果。)无需等待答案就可以关闭函数(Python)

我的代码是像这样的:

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个线程并通过普通队列向他们提交URL。 –

回答

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"