2016-07-12 16 views
4

私は定期的にHTTPリクエストを送信しますが、任意の時点で(メインプロセスと呼ばれる)他のスレッド/プロセスによって中断することができます(要求プロセスと呼ばれる)プロセスを書いています。で、Tornadoで割り込み可能なtime.sleepを実装する方法は?

# in the main process 
poison_pill_event= multiprocessing.Event() 

# pass "poison_pill_event" to the requesting process 

# in the requesting process which sends requests every wait_interval seconds 
poison_pill_event.wait(timeout=time_interval) 

これは私がtime.sleep(の割り込みバージョンを持つことができるようになる):当初、私は次の要求を送信する前に適切な遅延を待つmultiprocessing.Eventオブジェクトとの要求のためのスレッドプールを使用していましたケース私はプロセスを殺す必要があります。それ以外の場合は、タイムアウト後にコードを実行し続けることができます。

最近私は、必要なスループットとリソースを考慮すると、非同期設計が優れた選択肢であり、私はTornadoを使用しようとしていることがわかりました。 gen.sleepをノンブロッキング待ちとして使用し始めましたが、中断することはできません。 その後、割り込みを許可するためにToro.Event's wait functionを使用して切り替えました。ただし、Toro.Eventのdelayはマルチプロセスと異なります。イベントのtimeoutでは、タイムアウト例外が発生し、実行が中止されます。また、私はプロセス間で共有することはできないと信じているので、現在私の主なプロセスを要求プロセスとマージしようとしていますが、それはあまり難しくありません。

私の質問は、私が竜巻でmultiprocessing.Event.waitとした振る舞いをどのように再考できますか?

答えて

4

Toroはもう必要ありません。 Tornado 4.2以降には、Toroのすべての機能が含まれています。

代わりにイベントの条件で、このような何かを試してみてください:あなたはログイン表示されます

import datetime 
import logging 

from tornado import gen, options 
from tornado.ioloop import IOLoop 
from tornado.locks import Condition 

condition = Condition() 


@gen.coroutine 
def waiter(): 
    for _ in range(10): 
     yield condition.wait(timeout=datetime.timedelta(seconds=1)) 
     logging.info("Tick") 


@gen.coroutine 
def notifier(): 
    yield gen.sleep(4.5) 
    logging.info("Notify") 
    condition.notify() 


@gen.coroutine 
def runner(): 
    # Yield two Futures; wait for waiter() and notifier() to finish. 
    yield [waiter(), notifier()] 


options.parse_command_line() # Configures logging. 
IOLoop.current().run_sync(runner) 

出力のように:第二にあった「通知」というか、

[I 160712 12:00:28 foo:15] Tick 
[I 160712 12:00:29 foo:15] Tick 
[I 160712 12:00:30 foo:15] Tick 
[I 160712 12:00:31 foo:15] Tick 
[I 160712 12:00:31 foo:21] Notify 
[I 160712 12:00:31 foo:15] Tick 
[I 160712 12:00:32 foo:15] Tick 
[I 160712 12:00:33 foo:15] Tick 
[I 160712 12:00:34 foo:15] Tick 
[I 160712 12:00:35 foo:15] Tick 
[I 160712 12:00:36 foo:15] Tick 

お知らせ2つの "ティック"がありますが、それ以外の場合はティックは1秒に1回しか発生しません。

+1

素晴らしい作品です!これを使用しているすべてのノート: 'condition.wait'は時間がかかります。ただし、数値を指定するとエラーは発生しませんが、同じ方法では動作しません。数値はIOLoop.timeと同じ参照点を持つ絶対時間値とみなされているようです。助けをもう一度@ A2Jありがとうございます。 –

関連する問題