2016-04-24 9 views
0

だから、私はちょうど非同期プログラミング(特にトルネードフレームワーク)のまわりで私の頭をラップしようとしている、と私は基本から始めたいと思った:2つのコルーチンの「待っている」の呼び出し:2つのシーケンシャルコルーチン(非同期関数)が並行して実行されないのはなぜですか?

from tornado.ioloop import IOLoop 
from tornado.web import Application, url, RequestHandler 
from tornado.gen import sleep 

class TestHandler(RequestHandler):  
    async def get(self): 
     f1 = await self.test("f1") 
     f2 = await self.test("f2") 
     self.write(f1 + " " + f2) 

    async def test(self, msg): 
     for i in range(5): 
      print(i) 
      await sleep(1) # this is tornado's async sleep 
     return msg 

app = Application([url(r'/', TestHandler)], debug=True) 
app.listen(8080) 
ioloop = IOLoop.current() 
ioloop.start() 

問題は、しかし、私は私のブラウザでlocalhost:8080を襲った、と私のpythonコンソールを見つめたとき、私はトルネードFAQを読んだ

0 1 2 3 4の2つの織り交ぜシーケンスが、二つの連続シーケンスを...表示されていないということです私が間違ってやっていることを理解できていないように思えます。

答えて

2

これはf1を実行し、それが終了するのを待ち、その後、f2を実行します:

f1 = await self.test("f1") 
    f2 = await self.test("f2") 

並行して物事を実行するには、次のことができないawaitは、第二を開始する前に、最初の1。これを実行する最も簡単な方法は、両方の1 awaitでそれらを行うことです。

f1, f2 = await tornado.gen.multi(self.test("f1"), self.test("f2")) 

またはAdvanced例では、あなたはそれが後でそれを待つために戻ってくるのを待たずにf1を起動することができます。

f1_future = tornado.gen.convert_yielded(self.test("f1")) 
f2_future = tornado.gen.convert_yielded(self.test("f2")) 
f1 = await f1_future 
f2 = await f2_future 
+0

2番目のコードブロック(待望の先物)は並行して実行されません...私はあなたを誤解していますか? – StevieP

+0

ああ、そうです。このパターンは '@ gen.coroutine'で動作しましたが、' async def'関数は何かがそれらを待つまで開始しません。 –

+0

ベストプラクティスを説明してもらえますか? Tornadoと 'asyncio'(特に' async'/'await')は実際にはうまくいっていないようです。非同期コードの書き込み/飾り付けについてはどうしたらよいですか(竜巻を使用する場合) – StevieP

関連する問題