kubo39's blog

ただの雑記です。

PythonのC拡張をgeventとうまく組み合わせる方法

geventは標準ライブラリのsocketモジュールにモンキーパッチをあてることで既存のライブラリもうまく非同期であつかうことができるのだが、C拡張が使われている場合はこの手法は使えないという問題が以前から知られていた.(なのでgeventはPyMySQLと組み合わせる使い方が多い)

これを問題だと思った人たちがいて、こんなライブラリを作った.

これは共有ライブラリのELFヘッダにhookポイントを埋め込んでやるというあらびきな方法で実現している. 詳しくはここ 昔は独自にmysql-connector-cをポートしてビルドしてたっぽいけど.

使い方としては、

import greenify
greenify.greenify()

というコードを書いてやればプロセスから呼び出す共有ライブラリは全部リダイレクションされるようになる.

本日の便利情報でした.ご査収ください.