MagicStack / MagicStack/uvloop
echoclient.py fails on recent MacOS and Linux Python releases that default to the spawn start‑method
まだ誰も着手していません。
- 主要言語
- Cython
- スター
- 11.9k
- フォーク
- 616
- PR マージ指標
- 30日以内にマージされた PR はありません
説明
Recent Python releases on macOS and Linux use the spawn start‑method by default for new processes.
IIRC spawn starts a brand‑new interpreter and imports the target module it relies on pickling to transport the target function.
As only module‑level objects can be pickled and run_test is defined inside the if __name__ == "__main__" block, the child process tries to unpickle and look up as an attribute of the module __mp_main__. That attribute does not exist, and the unpickler raises:
Process ForkServerProcess-2:
File "/usr/lib/python3.14/multiprocessing/process.py", line 320, in _bootstrap
self.run()
~~~~~~~~^^
File "/usr/lib/python3.14/multiprocessing/process.py", line 108, in run
self._target(*self._args, **self._kwargs)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/concurrent/futures/process.py", line 242, in _process_worker
call_item = call_queue.get(block=True)
File "/usr/lib/python3.14/multiprocessing/queues.py", line 120, in get
return _ForkingPickler.loads(res)
~~~~~~~~~~~~~~~~~~~~~^^^^^
AttributeError: module '__mp_main__' has no attribute 'run_test'
I am not filing a pull request because there are at least three fixes, and which one is implemented depends on the project team's preferences.
The options I see that fit the file's stated minimal changes from upstream constraint:
- Move
run_testto the module level. - As this is I/O bound, change to the
ThreadPoolExecutor - Force the use of
fork()
import multiprocessing
multiprocessing.set_start_method('fork', force=True)
All three options seem to benchmark close to each other on Linux/MacOS. Personally I lean towards the ThreadPoolExecutor option as that is my personal default for I/O bound concurrent operations.
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
echoclient.py から始め、特に main ブロック内の run_test の定義と、そのプロセスプールのセットアップを確認してください。プロジェクトの最小限の変更という制約に照らして、提案された 3 つのアプローチを検討し、その後、spawn を使用して Python のリリース上でクライアントを実行し、意図した動作を変更せずに問題が解決されていることを確認してください。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- testing
- issue の種類
- バグ
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100