Skip to content

Instantly share code, notes, and snippets.

@nakamuray
Created June 12, 2016 12:20
Show Gist options
  • Save nakamuray/e60646d3a01f6863596f696f94f5df4c to your computer and use it in GitHub Desktop.
Save nakamuray/e60646d3a01f6863596f696f94f5df4c to your computer and use it in GitHub Desktop.

ふわふわした asyncio の話

(具体的な実装についてはなるべく触れず、なんかイメージ的な話をする。)

イベント駆動

  • 「これこれのイベントが起こったら、この続く処理を実行してくれ」
    • イベントの例
      • 時間経過
      • データが手に入ったら
      • (GUI 系だと、ボタンがクリックされたら等)
    • 続く処理とは
      • コールバック関数
      • この中で更に別のイベントの待受を指示されたりする
  • イベントの待ち受けや、コールバックの実行を行うのが event loop
    • 複数のイベントをいっぺんに待ち受けることができる
    • コールバックの実行は一つずつ
      • コールバック実行が終わったら、またイベント待受に戻る
  • 低レベルなイベントをベースとして、より高レベルなイベントを定義していく
    • socket (fd) が読み書き可能になったら
      • データが一行読み出せたら
      • データを指定した byte 数読み出せたら
        • HTTP レスポンスが返ったら
          • ...

future

  • コールバック関数の管理に使うもの
    • コールバック関数を登録できる
    • 登録されたコールバック関数をまとめて発火できる
  • コールバック関数を受け取る代わりに、 future を返す
    • コールバックを保持する代わりに、 future を保持する
    • コールバックを呼び出す代わりに、 future に結果をセットする
  • コールバック関数を渡す代わりに future を受け取る
    • future にコールバック関数を登録する

coroutine

  • 途中で停止したり再開したりできるもの
  • イベント駆動と組み合わせることで便利になる
    • イベントを待ち受けるタイミングで停止する
    • イベントが起こったら再開する
      • イベントのコールバックとして、再開処理を呼んでもらう
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment