python
OpenTelemetry 公式の Instrumentation ライブラリを使っていると、Requestsのspanの名前が "GET" だけだったり、 mysqlclient のspanが "SELECT" だけだったりします。 たとえばGrafanaでトレースを見ていると "SELECT" ばかりが何個も並んでいて、一つ一つ…
前回の記事 ではNiquestsに最近修正された深刻なバグがあることを紹介しましたが、それで HTTP/2 や HTTP/3 の利用を不安に思い HTTP/1.1 を使うことにしていました。そして HTTP/1.1 の場合に Requests と pool_maxsize の振る舞いが大きく異なることに気が…
最近何度か紹介していた Niquests に致命的なバグがあり、問題の大きさの割にアナウンスが小さいので解説しておきます。 なお、このバグは urllib3-future 2.14.906 (2025-11-06) から発生し、2.15.902 (2026-02-03) で修正されました。 Niquests を使ってい…
functools.cacheをメソッドに使う - methaneのブログ で紹介した、普通に functools.cache をメソッドに使うとメモリリークになってしまう問題ですが、半年ぶり2回目遭遇したので再発防止しないとなと思ったらすでに静的チェックがありました。 docs.astral.…
以前の記事で、functools.cache をそのままメソッドに使うとメモリリークになることと、その回避方法をいくつか紹介しました。 最後に紹介していた方法がこれです。 from functools import cache class A: def __init__(self, x): self._x = x self.f = cach…
概要 私は、uWSGIを使う時は基本的にマルチプロセス、シングルスレッドの設定を推奨します。しかし、レスポンスタイムがときどき遅くなる外部API呼び出しを含む場合など、メモリ使用量やthundering herd問題を考慮しつつ多くの並列数が必要な場合にマルチス…
過去数回の記事で Requests や httpx の問題点や細かい挙動について触れてきました。これらのライブラリの代わりになるもう一つの有力なHTTPクライアントとして Niquests を紹介します。 NiquestsはRequestsのforkで、高い互換性を保ちながら、非同期処理やH…
前回の記事でhttpxの検討を進めた後にこんな気になる記事を見かけたので現状を調査しました。 gfx.hatenablog.com 結論から言うと、これは httpx を async で利用する時の問題で、現状ではまだ解決されていません。同期APIを使っていれば問題ありません。 原…
Pythonで一番人気のあるHTTPクライアントライブラリはrequestsですが、requestsやその低レイヤーであるurllib3はidle_timeoutの設定を持っていないので、長時間アイドルが続いた接続を再利用した時に Connection Reset by Peer エラーが発生することがありま…
functools.cache は便利ですが、メソッドに対して使う時には注意が必要です。 from functools import cache class A: @cache def f(self, x): return x * 2 for i in range(1000): a = A() a.f(42) print(A.f.cache_info()) # CacheInfo(hits=0, misses=1000…
httpx をコネクションプールありで使う場合は client = httpx.Client() して client.get() などを使いますが、コネクションプールなしで使う場合は httpx.get() などを使います。 この httpx.get() のような単発でHTTPリクエストを実行するAPIは実際には内部…
しかし、たとえば標準ライブラリの concurrent.futures.ThreadPoolExecutor はdamonスレッドを使っていません。 そのため、 executor.shutdown(wait=True) を atexit から呼び出すことができません。atexitで終了させるスレッドはdaemonにしよう - methaneの…
リストを受け取ってループで処理する関数を実装するとき、引数のタイプヒントに list ではなく最小の要求として Iterable を書くことを好む人がいる。コードの実装が引数に対して必要としている最小要件(必要十分条件)を表すためだ。 def func(arg: Iterable…
なにかの処理をバックグラウンドスレッドで実行して、アプリケーション終了時にその処理を止めたいことがあります。 たとえばOpenTelemetryのトレースやログを送信するためにスレッドが使われていますが、それらは終了時にバッファリングしているデータを送…
mysql-connector-python を使えば簡単なのですが、あえて mysqlclient を使う場合の話です。 まず、Pythonの公式DockerイメージはDebianベースになっていますが、Debianではデフォルトではapt-getでMySQLをインストールできません。 (Debian sid では MySQL …
まだPR段階なので peps.python.org では表示されていません。Discussionはこちらです。 PEP 781: Adding __type_checking__ constant - PEPs - Discussions on Python.org 今までもtypingのインポートを避けるために from typing import TYPE_CHECKING の代…
Python 3.13 を PyMySQL のCIに追加したら、次のようなエラーが発生した。 "Can't connect to MySQL server on '127.0.0.1' ([SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Missing Authority Key Identifier (_ssl.c:1018))" 調べてみると…
github.com Python 3.12から参照カウントを固定化するImmortal Objectが導入されたのですが、それがinterned string全てを強制的に固定参照カウントにしてしまっていました。 Pythonの文字列はimmutableなので、短くて大量に同じ値が出てくる可能性がある文…
structlogシリーズ、今回(たぶん最終回)は get_logger() について。ソースコードを解説していく前に、まず重要な挙動から。 >>> import structlog >>> from structlog import PrintLogger >>> def logger_factory(): ... print("creating logger") ... ret…
前回はBoundLoggerのコンテキスト管理とログメソッドについて解説しました。 methane.hatenablog.jp 今回はログメソッドが呼ばれた後の処理についてみていきます。 _proxy_to_logger() まずはログメソッドがどうなっていたかのおさらいです。 # FilteringBou…
structlogを採用した場合、アプリ側がログを書くために使うインスタンスはBoundLoggerかそれをラップしたクラスのインスタンスになります。このクラスは重要なのでstructlogのドキュメントにもこのクラスのためのページがあります。 www.structlog.org struc…
Pythonのパッケージ・プロジェクト管理ツールはまだ乱立状態にあって、どれを使えばいいのかわからないから慣れたpyenv+pipを使おうという判断をする人がいるかもしれない。その判断自体は別に否定しないけれども、初心者に教える時にpyenvを教えるのはもう…
ryeをWindowsにインストールする方法を調べてみました。 準備 rye をWindowsで使うためには、開発者モードを使うことが推奨されている。 FAQ - Rye 開発者モードを有効にしないとシンボリックリンクが使えなくてジャンクションポイントやコピーが使われるよ…
structlogのドキュメントを読んでいると、 structured tracebacksというものが登場する。 structured logging が良いものなのだから、structured tracebacksも良いものなのだろうか? API Reference - structlog 24.1.0 documentation structlog.processors.…
Pythonのデフォルトの例外+トレースバック表示は、主にターミナル表示向けに調整されています。(次のPython 3.13からはカラー表示にも対応する予定です。) ターミナル表示用にフォーマットされたトレースバックは、(もちろんカラーを使わなければ)非構…
Pythonでアプリケーションのロギングライブラリとして標準ライブラリのlogging以外を使うときは、loggingを使ってる既存のコードをどうするかを考えないといけない。アプリケーション自体の中身を全部一気に書き換えるとしても、依存ライブラリがloggingを使…
今までuWSGIをシングルスレッド、マルチプロセスで使っていたのだけれども、昔に比べて外部のAPI呼び出しが増えているのでマルチスレッド化を検討している。 uWSGI uWSGIでマルチスレッドを有効にした時は、各workerスレッドがacceptする形で動作する。スレ…
Ryeを使っている状態で uv venv をすると、次のようなエラーになります。 $ uv venv × Querying Python at `/Users/inada-n/.rye/shims/rye` failed with status exit status: 2: │ --- stdout: │ --- stderr: │ error: unexpected argument found │ --- pyt…
uvにはまだ self update の機能がありません。 Homebrewにはすでにuvが追加されて頻繁にアップデートされているので、Homebrewユーザーは brew install uv がおすすめです。 Homebrewを使ってない環境でuvをインストールし手軽にアップデートするには 、rye …
先週にRuffを開発しているAstralがuvを発表しました。 astral.sh uvは現在のところはvenv, pip, pip-toolsの基本的な機能を提供していますが、将来は"Cargo for Python"になることを目標にしています。 一見すると乱立しているPythonのパッケージ管理ツール…