`OSError` when creating a `multiprocessing.Queue` with `maxsize > 32767`
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 77.2k
- フォーク
- 36k
- PR マージ指標
- PR 指標を取得中
説明
Bug report
Bug description:
While exploring multiprocessing.Queue, I encountered an exception which was confusing and I couldn't reconcile from Googling. Briefly, it seems that the Queue object allows providing a maxsize which exceeds from .synchronize import SEM_VALUE_MAX. If that occurs, the exception below is raised.
I suspect but haven't confirmed that this issue exists in main as the maxsize does not carry an upper bound.
If this is acknowledged as a bug, or at least a source of improvement for the user experience, I would be happy to provide a pull request that (1) sets an upper bound as SEM_VALUE_MAX and (2) provides a Warning that the upper bound was exceeded.
$ cat queue-test.py
import multiprocessing as mp
import sys
class mw:
def __init__(self, q):
self.q = q
def writer(self):
for i in range(5):
self.q.put(i)
print(f"writer placed {i}", flush=True)
self.q.put(None)
def reader(self):
while True:
i = self.q.get()
if i is None:
break
print(f"reader got {i}", flush=True)
if __name__ == '__main__':
maxsize = int(sys.argv[1])
ctx = mp.get_context('spawn')
qq = ctx.Queue(maxsize)
f = mw(qq)
wp = ctx.Process(target=f.writer)
wp.start()
rp = ctx.Process(target=f.reader)
rp.start()
wp.join()
rp.join()
$ python queue-test.py 32767
writer placed 0
writer placed 1
writer placed 2
writer placed 3
writer placed 4
reader got 0
reader got 1
reader got 2
reader got 3
reader got 4
$ python queue-test.py 32768
Traceback (most recent call last):
File "/Users/dtmcdonald/queue-test.py", line 24, in <module>
qq = ctx.Queue(maxsize)
^^^^^^^^^^^^^^^^^^
File "/Users/dtmcdonald/miniconda3/envs/duckdb/lib/python3.11/multiprocessing/context.py", line 103, in Queue
return Queue(maxsize, ctx=self.get_context())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dtmcdonald/miniconda3/envs/duckdb/lib/python3.11/multiprocessing/queues.py", line 49, in __init__
self._sem = ctx.BoundedSemaphore(maxsize)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dtmcdonald/miniconda3/envs/duckdb/lib/python3.11/multiprocessing/context.py", line 88, in BoundedSemaphore
return BoundedSemaphore(value, ctx=self.get_context())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dtmcdonald/miniconda3/envs/duckdb/lib/python3.11/multiprocessing/synchronize.py", line 152, in __init__
SemLock.__init__(self, SEMAPHORE, value, value, ctx=ctx)
File "/Users/dtmcdonald/miniconda3/envs/duckdb/lib/python3.11/multiprocessing/synchronize.py", line 57, in __init__
sl = self._semlock = _multiprocessing.SemLock(
^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: [Errno 22] Invalid argument
$ python -c "from multiprocessing.synchronize import SEM_VALUE_MAX; print(SEM_VALUE_MAX)"
32767
CPython versions tested on:
3.11, 3.12
Operating systems tested on:
macOS
Linked PRs
- gh-119542
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
リンクされている gh-119542 から始め、Queue の初期化と SEM_VALUE_MAX の周辺にある Lib/multiprocessing/queues.py および Lib/multiprocessing/synchronize.py を調べてください。maxsize の値 32767 と 32768 を使って queue-test.py で動作を再現してください。done では、サポートされている semaphore の上限を超える値に対する無効な引数エラーに対処する必要があります。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- operating-systems
- issue の種類
- バグ
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 25/100