2012-11-30 12 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を送信する必要はありません。 –

答えて

2

threadingモジュールまたはmultiprocessingモジュールを使用して、database、ファイルまたはqueueのいずれかの結果を保存します。

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" 
関連する問題