2017-07-25 6 views
0

Webアプリケーションで非同期サブプロセスロックが必要です。 私は次のコードを書き込む:マニュアルで平均収率とは何もなし(tornado.gen.moment)

r = redis.Redis('localhost') 
pipe = r.pipeline() 
is_locked = False 
while not is_locked: 
    try: 
     pipe.watch(lock_name) 
     current_locked = int(pipe.get(lock_name)) 

     if current_locked == 0: 
      pipe.multi() 
      pipe.incr(lock_name) 
      pipe.execute() 
      is_locked = True 
     else: 
      yield None 
    except redis.WatchError: 
     yield None 
return True 

WRITENそのtornado.gen.moment(yield Noneバージョン4.5以降)IOLoopは、一回の反復のために実行できるように得てもよい特別なオブジェクトです。使い方?他のフィーチャオブジェクト(他のリクエストから)と次の反復ですか?そうではありませんか? yield Noneは使いやすいですか?

+0

ソースコードのうち、tornado.gen.coroutineで装飾された機能 – COUNTERKILL

答えて

2

gen.momentは解決されました。将来のオブジェクトがioloopにコールバックで追加されました。これにより、ioloopの1回の反復を実行できます。

yield Noneは、コルーチンのgen.Runnerでconvert_yieldedを使用してgen.momentに変換されます。用ioloopのadd_timeout

  • 世論調査でスケジュールioloopのadd_callbackまたはadd_callback_from_signal

  • 実行コールバックを使用してスケジュール

    1. 実行コールバック:各反復で

      ioloopは(基本的にwhile True)のようなものを行いますfdイベント(例えば、ファイルdescirptorが書き込みまたは読み込みの準備をするのを待つ)もちろん、ioloopをブロックしないようにするには、投票にタイムアウトがあります。だから、ポイントyield gen.momentになって準備ができてFDS

  • ランハンドラは、1時間(一回の反復)のために上記のすべてのことを行うことができます。

    例として、非同期タスク(iclopの実行を必要とするhttpclientフェッチ)をスケジュールしましょう。一方、ブロック機能(time.sleep)もあります。

    import time 
    from tornado import gen 
    from tornado.ioloop import IOLoop 
    from tornado.httpclient import AsyncHTTPClient 
    
    
    @gen.coroutine 
    def fetch_task(): 
        client = AsyncHTTPClient() 
        yield client.fetch('http://google.com') 
        print('fetch_task finished') 
    
    
    @gen.coroutine 
    def blocking(): 
        start_time = time.time() 
        counter = 1 
        while True: 
         time.sleep(5) 
         print('blocking for %f' % (time.time() - start_time)) 
         yield gen.moment 
         print('gen.moment counter %d' % counter) 
         counter += 1 
    
    
    @gen.coroutine 
    def main(): 
        fetch_task() 
        yield blocking() 
    
    
    IOLoop.instance().run_sync(main) 
    

    観察:

    • yield gen.momentせず、fetch_tasktime.sleep
    • 増加/減少値がfetch_taskのためioloopのに必要な反復の数には影響しません終了されることはありません完了してください。つまり、AsyncHTTPClient.fetchN + 1(gen.moments +タスクスケジュール)のioloop(コールバックの処理、fdのポーリング、イベントの処理)との対話です。
    • gen.momentが必ずしもそうであるとは限りません。他のタスクは完了します。むしろ、完全性を一歩近づける機会を得ます。
  • +0

    ありがとうございました! – COUNTERKILL

    関連する問題