自分が知らなくて大変だったことを書き留めておくメモ。
cloudpickle
標準pickleの上位互換。標準ではpickleできないものがあらかたpickleできる。pip install cloudpickle
してimport cloudpickle as pickle
で使う。
演算子//
int / int
がfloat
になる面白言語Python3だが、int
を返す除算演算子//
もある。
組み込み関数divmod()
商とmodを同時にタプルで返す。
flake8
'cmd.py'というファイル名のモジュールがあると、原因究明が途方もなく困難な落ち方をするので、この名前は使わない。
faulthandler
C拡張モジュールやNumbaを使うと、ACCESS VIOLATIONでプロセスが落ちることがある。素のPythonは黙って落ちる。「プロセスが落ちた」とわかるまでに大変な目にあう。
だから、C拡張モジュールやNumbaを使うときは最初に必ず、
import faulthandler
faulthandler.enable()
しておく。こうするとACCESS VIOLATIONで落ちるときにスタックトレースをstderrに出力する。
pprint.pformat()
辞書とプロパティを再帰的にインデントして文字列にしてくれる。
Pythonのスレッドは何に使うのか
Pythonのスレッドは一応ネイティブスレッドのはずだが、限りなくグリーンスレッドに近い。ほとんど何をしてもGILで逐次実行になる。多重I/Oにはasyncioがある。では何に使うのか?
答え:ProcessPoolExecutor管理下のワーカプロセスによるFutureをwait()すると、そのスレッドがブロックされるので、並列にwait()するために使う。
なお、loop.run_in_executor()でconcurrent.futuresのFutureをasyncioに変換してawait asyncio.gather()で待とうとすると、並列にawaitするとLinuxではデッドロックに陥る。理由は不明。しかしWindowsでは並列にawaitできる。死の罠だ。
Python 3.8では普通にasyncio.gather()
でloop.run_in_executor()
を複数awaitできる。
随時追記の予定。