我有一串链接进来,我想偶尔检查一下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 :(得分: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"
答案 1 :(得分:2)
您想要使用threading模块或multiprocessing模块,并将结果保存在database,文件或queue中。
您也可以使用gevent。