ひさふぃの日記

DjangoとPythonとLaravelが好き。大阪でフリーランスエンジニアやってます。

入門Python3のメモ 11章|並行処理とネットワーク

Pythonの入門書として各所でオススメされている入門Python3。

shikouno.hatenablog.com

前半7章までで基本をおさらいし、後半8章からは他分野で活用できそうなちょっとした応用編がオールインワン。みんなのPython 第4版の次に読むとちょうどいいレベル感。

その際、初めて知る箇所や曖昧でいつも検索する箇所を後で見返せるようにメモしておこうかと。

そのため、このメモは僕の知識的偏りから生み出されたものであることを最初にお断りしておきます。気になった方は書籍を購入してください。

入門 Python 3

ちなみに、1章は導入なのでメモがありませんが、1.2 Pythonと多言語の比較は面白いので必見!著者の冗談も随所に入っていて、面白くていい本です。

英語版はPDFが無料で公開されています。よろしければ!

Introducing Python

後半8章からは色んな分野に渡る知識が書いてあるため、広く浅くの内容になっています。大まかな概要を掴んだり、検索時に活用するワードのピックアップという読み方・メモり方になる予定。

並行処理

  • 11.1 並行処理
  • 11.1.1 キュー
  • 11.1.2 プロセス
  • 11.1.3 スレッド

処理を行う際にボトルネックになるのは、「I/Oバウンド」「CPUバウンド」どちらかである。

同期的なのは1列に並んで処理され、よく見るasync非同期的なのはタスクがそれぞれ独立して処理される。

仕事をまとめて行い次の仕事に行くのがバッチ処理。キューで最も一般的なものは先入れ先出し(FIFO)。

あるタスクをプロセスとして実装する場合、multiprocessingモジュールのProcessを用いている。

スレッドはプロセスを更に細分化したもので、threadingモジュールのThreadを用いている。

うーん、腑に落ちていないな。ググっても掴めなかったので、非同期処理が必要になった時に改めて学ぶことにします。

非同期ライブラリ・フレームワーク

  • 11.1.4 グリーンスレッドとgevent
  • 11.1.5 twisted
  • 11.1.6 asyncio

イベント駆動プログラミングは、イベントループを実行し仕事を外部に割り振りる。

geventとtwistedが主に取り上げられており、tornadoとgunicornはコラムに小さく取り上げられている。後者の2つは聞いたことあるんですが、前者の2つは初耳ですね。

geventはコルーチン、twistedはコールバックで非同期処理を実装できる。

どれ使えばいいの…となったところでasyncio。Pythonで非同期を調べると一番目にするモジュールで、上記と互換性のあるイベントループを提供しているとのこと。よくわからなければこれ使っておけば良さそう。

非同期処理全体の最適化

  • 11.1.8 キューを越えて

要求/応答:処理を渡す先のタスクに確認してもらう。バックプレッシャ・スロットリング:処理の早いタスクの速度を落とす。

これらを実装できるキューパッケージとしては、celery、rq、Queueなどがある。

ネットワーク

  • 11.2.1 パターン
  • 11.2.2 パブリッシュ/サブスクライブモデル

ネットワークアプリケーションはいくつかの基本パターンから成る。

  • 要求/応答(クライアント/サーバー):同期的な処理で、例としてはウェブブラウザとウェブサーバーのHTTP通信がある。
  • プッシュ(ファンアウト):準備が整っているところへデータを送る。例としてはロードバランサーの先にあるウェブサーバー。
  • プル(ファンイン):複数のソースからデータを受け付ける。例としては、ロガー。
  • パブサブ(パブリッシュ/サブスクライブ):パブリッシャがデータを送り出し、サブスクライバが受け取る。サブスクライバは特定タイプのデータ(トピック)だけを受け取ることもできる。例としては、テレビ。

パブサブシステムを作るには、Redis、ZeroMQ、RabbitMQ、pubsubhubbubpypiでpubsubを検索(pypubsub)を活用するのが良い。

Redisの紹介回数多いですね。著者がRedis推しなのでしょうか、それとも有名なのでしょうか。僕は聞いたことがなかったのですが、興味が出てきたのでいつか触ってみよう。

インターネット

  • 11.2.3 TCP/IP
  • 11.2.4 ソケット

通信規則をプロトコルと呼びレイヤに分かれており、上位レイヤは下位レイヤを基礎として、下位から順に電気信号など -> IP(Internet Protocol) -> TCP(Transmission Control Protocol)となっている。

ローカルマシンのIPアドレス127.0.0.1であり、名前はlocalhost。ループバックインタフェースと呼ばれる。

インターネットはTCP/IPを基礎としており、ソケットを介してやりとりされている。

さいごに

この章だけ他と比べて読むスピードと理解が半分になってしまうくらい難易度高い気がする。え、難しくない?僕だけ?特に並行処理はリベンジしたいですね。

プログラミングの世界は日進月歩なので、本で紹介されていても既に更新されていないものがあったりします。概要は把握して検索できるワードを拾いつつ、最新のツールはネットで情報収集が大切ですね。

最後までお読みいただきありがとうございます。それじゃ!

入門 Python 3

入門 Python 3