3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

是丈は心得おくべし:Python3

Last updated at Posted at 2019-04-06

自分が知らなくて大変だったことを書き留めておくメモ。

cloudpickle

標準pickleの上位互換。標準ではpickleできないものがあらかたpickleできる。pip install cloudpickleしてimport cloudpickle as pickleで使う。

演算子//

int / intfloatになる面白言語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できる。

随時追記の予定。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?