オライリーから出ている「Using Asyncio in Python」という本の目次を翻訳してみました。
tl;dr
めちゃめちゃ大好きな書籍である「Using Asyncio in Python」の目次を翻訳しました。
Pythonというプログラミング言語の標準ライブラリである asyncio
について書かれた本です。
2021年9月現在、まだ翻訳されていません。
本の情報
- 著:Caleb Hattingh
- 出版:2020年2月
- 出版社:O’Reilly Media, Inc.
- ISBN: 9781492075332
販売元であるオライリーのサイト
著者の方のGitHubリポジトリ
どんな本なの?の前にasyncioって。
この本がどんな本なのか、という話をする前に、少しasyncioについてです。
asyncioは非同期IOで並行処理を行う標準ライブラリです。それらをイベントループを利用しシングルスレッドで実現します。
asyncioはとても巨大でたくさんの機能があります。公式ドキュメントでも高水準APIと低水準APIに分かれているほどです。
そしてなにより、Python3.4でのリリース(2014年)以降、毎年リリースされるPythonの新しいバージョンで新機能が追加されています。
で、どんな本なの?
asyncioってなんかとっつきづらそうな感じがしませんか?
- 言葉がむずかしい - 非同期IO、並行処理
- 概念がむずかしい - シングルスレッドでイベントループ
- 進化が速く追いづらい - 毎年更新
こんなとっつきづらさを解決してくれたのが、この本でした。だってみてみてください。
クイックスタートという節で紹介されているasyncioはこんなにも簡単です。
Example 3-1. The “Hello World” of Asyncio
# quickstart.py
import asyncio, time
async def main():
print(f'{time.ctime()} Hello!')
await asyncio.sleep(1.0)
print(f'{time.ctime()} Goodbye!')
asyncio.run(main())
あら簡単 🎉
asyncioの使い所を簡単に分かりやすくそして短く(超大事!)教えてくれます。
Using Asyncio in Pythonのコンセプト
この本は、「難しいasyncioを簡単に」というコンセプトで書かれています。
Python3.4のリリース以降、バージョンアップして進化していく中で、使いやすい高レベルAPIが追加され簡単に使えるようになっている。 でも、それを簡潔に伝えらているリソースがない。そんな課題を解決してくれます。
そのため、内容の中心は高レベルAPIです。昔からasyncioを使っている方には少し退屈な内容かもしれません。
asyncioの幻想
冒頭で、asyncioで解決できること、できないことを明確にして内容に入っていきます。
asyncioの幻想とされる部分を明らかにし、それを 全否定 します。これが衝撃でした。
幻想としてあげられるのは以下です。Pythonを触ったことがあって、asyncioをあまり触っていなかった方(わたし)、こんな幻想を抱いていただのではないでしょうか。
- asyncioは私のコードを爆速にしてくれる
- asyncioはスレッドを冗長にする
- asyncioは競合状態を防いでくれる
- asyncioは並行プログラミングを簡単にしてくれる
そう、asyncioをただ使うだけではわたしたちのプログラムは爆速にはなりません。正しく用法用量を守って使いましょうということが本の中で綴られます。
後半ではさらにtwistedやaiohttp、asyncpgやSanicといったサードパーティのasyncioを利用したライブラリを用いて具体的な使い方も教えてくれます。(残念ながらFastAPIはない。。。)
目次
さてでは本題。翻訳してみました。
翻訳版
Asyncioの紹介
- スレッドボットのレストラン
- エピローグ
- Asyncioが解決しようとしている問題とは?
Threadingの真実
- Threadingの良いところ
- Threadingの悪いところ
- ケーススタディ: ロボットとカトラリー
Asyncioの歩き方
- クイックスタート - 真のHello World
- Asyncioの塔
- コルーチン
- 新しいキーワード: async構文
- 新しいキーワード: await構文
- イベントループ
- TasksとFutures
- 非同期コンテキストマネージャー: async with
- contextlibの使い方
- 非同期イテレーター: async for
- 非同期ジェネレーターをシンプルなコードで
- イベントループの起動と終了の方法
- gather()関数の「return_exceptions=True」とは何か
- シグナル63
- Executorを待ってシャットダウンする
原著
Introducing Asyncio
- The Restaurant of ThreadBots
- Epilogue
- What Problem Is Asyncio Trying to Solve?
The Truth About Threads
- Benefits of Threading
- Drawbacks of Threading
- Case Study: Robots and Cutlery
Asyncio Walk-Through
- Quickstart
- The Tower of Asyncio
- Coroutines
- The New async def Keywords
- The New await Keyword
- Event Loop
- Tasks and Futures
- Create a Task? Ensure a Future? Make Up Your Mind!
- Async Context Managers: async with
- The contextlib Way
- Async Iterators: async for
- Simpler Code with Async Generators
- Async Comprehensions
- Starting Up and Shutting Down (Gracefully!)
- What Is the return_exceptions=True for in gather()?
- Signals 63
- Waiting for the Executor During Shutdown
20 Asyncio Libraries You Aren’t Using (But…Oh, Never Mind)
- Streams (Standard Library)
- Case Study: A Message Queue
- Case Study: Improving the Message Queue
- Twisted
- The Janus Queue
- aiohttp
- Case Study: Hello World
- Case Study: Scraping the News
- ØMQ (ZeroMQ)
- Case Study: Multiple Sockets
- Case Study: Application Performance Monitoring
- asyncpg and Sanic
- Case Study: Cache Invalidation
- Other Libraries and Resources
Concluding Thoughts
A. A Short History of Async Support in Python
B. Supplementary Material
Index