日々のあれこれφ(..)

もっぱら壁打ち

【Python】並行処理再入門2

reiichii.hateblo.jp

1から大分日が空いてしまったのですが、あれからエキスパートPythonプログラミング改訂2版で標準ライブラリで実装する並行処理のサンプルコードを動かして理解するなどしておりました。

でやはり自分でも一つ何か作ってみようと思い立ち、書いたコードの忘備録が今回の記事です。

より実践的なコード書きたいなぁと思いつつ、実践的なコードってなんだって情報収集して考えた結果、loggerの実装に行き着きました。

書いたコード

github.com

概要は書いてある通りです。テスト用データを作る機会があったので、そんな感じの仕様になりました。

具体的には、次の情報に基づいて以下のような処理をしています。

  • 情報
    • 全ユーザー数
    • 全アイテム数
    • ヘビーユーザーが持つアイテムの数
    • 一般ユーザーが持つアイテム数
  • 処理
    • メインプロセスが立ち上がる
    • 作成するファイルの情報を生成し、キューに積む
      • キューに積まれる情報:ユーザーid、アイテムid、後ほどtemplateに埋め込まれるデータの参照先
    • 環境変数で指定した数の子プロセスを立ち上げる
      • 子プロセスがキューの情報をgetし、templateからファイルを作成していく

終了するときはctrl + cです。

ログ周りに関しては、QueueHandlerとQueueListenerを使って次のようになっています。

  • mainプロセス、子プロセス
    • QueueHandlerを設定する。インスタンス生成時に渡したログ用のqueueに発生したログをputしていく
  • listenerプロセス
    • Listenerによって生成されたプロセス。queueからログを取得しファイルに書き出していく

ログの実装に関しては、公式のクックブックを参考にしました。

Logging クックブック — Python 3.9.4 ドキュメント