Closed5
cpprb開発で得た/調べた Python/Cython知見 (主にmultiprocessing関連)
multiprocessing.Process は、3.8 から macOS も spawn がデフォルトに変更。(Windowsは元々 spawnのみ)
spawn は fork と異なり、pickle 可能なものだけが渡せる。
バージョン 3.8 で変更: macOS では、 spawn 開始方式がデフォルトになりました。 fork 開始方法は、サブプロセスのクラッシュを引き起こす可能性があるため、安全ではありません。 bpo-33725 を参照。
Cython の拡張タイプ (cdef class
) は、全メンバー変数がPython互換で、かつ __cinit__
が定義されていない時にのみ、自動で __reduce__
を定義する。 (= pickle可能になる。)
__reduce__()
の定義
カスタム 引数
なし
戻り値
pickle から復元するための要素数 2~6 の tuple
(6番目は、3.8 からの追加)
- 初期オブジェクトを生成するための callable
- 上記 callable の引数の tuple。無引数のときは、空の tuple を渡す
-
__setstate__()
に渡すための状態。__setstate__()
がなければ、__dict__
に追加される - 変数を yield するイテレータ。
obj.append(item)
または、obj.extend(list_of_items)
で追加される - key-value ペアをyieldするイテレータ。
obj[key] = value
でセットされる - callable。
callable(obj,state)
で呼び出す。Noneでなければ、__setstate__()
の代わりに利用される。
Numpy の dtype と ctypes を変換には、 numpy.ctypeslib
を利用できる。
multiprocessing.sharedctypes.RawArray
に ndarray の view を貼ることで、共有メモリ上に ndarray を配置し複数プロセスからアクセスできる
ここで整理した知見をもとに、 cpprb のバージョンを更新 (v9.3.3 -> v9.4.2) して、 tf2rl にPRを送った。
ドキュメントの整理が終わったら、記事を書きたい。
このスクラップは2021/01/10にクローズされました