Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

asyncio 備忘録

Last updated at Posted at 2019-09-22

何がわからないか、わからない

◯ 目的

CPU bound と I/O bound がある。主に I/O bound に対する解決策。

◯ 概念

この辺の違いを切り分けていく必要性がある。

  • ジョブ
  • プロセス
  • スレッド
  • コルーチン(yield from)
  • コルーチン(async/await)

もしかして goroutine って co-routine をもじってるのか。あいも変わらず Stackoverflow は神ですよと。

◯ キーワード

内部の仕組みとして event loop という言葉が重要そう。クルクル回してどれを実行するか決定する。これは確かにオーバーヘッドだよな...

◯ 背景

なんか非同期周りはごちゃごちゃしてるな、と思ったら、そんなに定まっていなかったのか...

このスライドが一番ありがたい...

c10k問題の時代背景として、webアプリでもXHRの登場が契機となってロングポーリングなどを用いたアプリケーションが増加した、ということと、時期を同じくしてオンラインゲームの隆盛があり、アプリケーションが要求する処理のスタイルが変わったことが背景にあるのではという考察をしました
https://twitter.com/moriyoshit/status/1134121911867154433

じゃあ20年経ってこの界隈の何が変わったかというと、恒常的に扱うべき問題として認知され、言語設計の意思決定までに影響を及ぼすまでになった、という側面はあるのではないかと
https://twitter.com/moriyoshit/status/1134270733209653248

朝起きて自分のツイートを見て内容の古くささにゾッとしたんですが、c10k論文、1999なんでもう20年前なんですよね…
https://twitter.com/moriyoshit/status/1134270005980278785

あとは PEP か...

Coroutines are a natural way of expressing many algorithms, such as simulations, games, asynchronous I/O, and other forms of event-driven programming or co-operative multitasking.
Coroutines via Enhanced Generators - PEP 342

◯ 用語と変遷

コルーチン
(コルーチン) コルーチンはサブルーチンのより一般的な形式です。 サブルーチンにはある時に入り別の時に出ます。 コルーチンには多くの異なる時に入り、出て、再開することが出来ます。 コルーチンは async def 文で実装されます。 PEP 492 を参照してください。

ジェネレータ関数みたいなものか...

coroutine function
(コルーチン関数) coroutine オブジェクトを返す関数です。 コルーチン関数は async def 文で実装され、await、async for、 および async with キーワードを持つことが出来ます。 これらは PEP 492 で導入されました。

マジか... コルーチンの用語もなんか曖昧な感じなのか... orz Python も非同期周りはなんか七転八倒してるな... もともとは、そこまで需要がなかったのだろうか。確かに考えてみると非同期やらなんやらって話は10年くらい前からちらほら聞き出していたからな。

asyncio的な意味でのコルーチンは、yieldしたコルーチンの実行を継続する主体がプログラマブルではなく、暗黙のコンテキストに紐づいたイベントループだったりデフォルトのスレッドプールだったりするために、実装自体は一般的な意味でのコルーチンそのものなのに、セマンティクスが違う
https://twitter.com/moriyoshit/status/1064445096521752577

観測範囲では、何をPythonにおいてcoroutineと呼ぶかという点についてコンセンサスが確立したわけではないと思います。しかし、asyncioが標準ライブラリである以上、いわゆるcoroutineはasync関数のことを指す、という状況になることは想像に難くないです
https://twitter.com/moriyoshit/status/1064429215439761408

Pythonの世界ではコルーチンによってgeneratorが実現されていて、generatorにyield expressionなどが追加されたものをPythonの中でcoroutineと呼ぶようになった。後から追加されたgeneratorのdelegationを活用した非同期I/Oライブラリがasyncioで、それのsyntactic sugarがasync/awaitキーワード
https://twitter.com/moriyoshit/status/1064411825972817920

◯ 仕様

gevent にしても何にしても、通常の関数では実現できないことを関数で書いてしまっていること。それを内部の CPython の実装で処理している。これが理解を妨げていた。

結局、専用の文法を設けてしまった方が良いのではなかろうか。受け手側も。asyncio というライブラリで受けているけど、これはこれで分かりにくいのでは無いだろうか... await が付加されたタイミングで実行されているのだろうか。

結局 yield を関数定義文でやろうとしたのは失敗だったのか。でも、ここまで需要が大きくなることを見越せなかったのではなかろうか... どうなのだろうか... 1つの文法に複数のものを混ぜ込んでしまうのは、もしそれが、あまり複雑なことをしないのであればその方が良いと思う。

Armin Ronacher はブログで文句言ってたな...

この辺の温度感は、継承と同じか。結局、何かしらの論理的な正しさがあるわけではなく、バランス感覚なんだよと思う。でも、その「バランス感覚」に対して、論理的な正しさがあるかのように主張すると、ヤバいことになる。でも、それはどんな議論でもそうか...

Asynchronous Python - Medium

これはめっちゃ分かりやすい記事だ。Real Python よりも先に読もう。

Async IO in Python: A Complete Walkthrough - Real Python

Real Python でざっくり通すか...

Miguel Grinberg Asynchronous Python for the Complete Beginner PyCon 2017

Flask Mega Tutorial の人か.., Chess の例は正直分かりにくかった... まず第一に人数とか考えて欲しいし、また第二にリソースの競合を起こしている例では無いから。

Chess master Judit Polgár hosts a chess exhibition in which she plays multiple amateur players. She has two ways of conducting the exhibition: synchronously and asynchronously.
Miguel Grinberg Asynchronous Python for the Complete Beginner PyCon 2017

この辺は、全体像がわかる。

Four ways to implement suspend/resume in Python:

  • Callback functions
  • Generator functions
  • Async/await(Python 3.5+)
  • Greenlets(requires greenlet package)
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?