python / python/cpython

`concurrent.futures.Executor.map` with `buffersize` should yield from buffer and raise after executor shutdown

オープン
#146,392 コメント 0 件 リアクション 1 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

stdlib topic-multiprocessing type-bug
主要言語
Python
スター
77.2k
フォーク
35.9k
PR マージ指標
PR 指標を取得中

説明

Bug report

Bug description:

As pointed by @salomvary in this discussion, the behavior of concurrent.futures.Executor.map with buffersize is misleading when iterating after the executor's shutdown. There is 2 cases:

  1. Create the generator, shut down the executor, start iterating:
with ThreadPoolExecutor(1) as executor:
    iterator = executor.map(str, range(8), buffersize=2)

# start iterating after the shutdown
assert next(iterator) == "0"
assert next(iterator) == "1"
# raises StopIteration
next(iterator)

In this scenario the elements from the buffer are yielded, then the iteration is stopped.

  1. Create the generator, start the iteration, shut down the executor, continue the iteration
with ThreadPoolExecutor(1) as executor:
    iterator = executor.map(str, range(8), buffersize=2)
    # start iterating before the shutdown
    assert next(iterator) == "0"

# raises "RuntimeError: cannot schedule new futures after shutdown"
next(iterator)

In this scenario a RuntimeError is raised by the first post-shutdown next, leaving not-yet-yielded results in the buffer.


I would vote for a mix of both: yield from the buffer and then raise the exception.

(the fix would be a dozen rows)

CPython versions tested on:

3.14, 3.15

Operating systems tested on:

macOS, Linux, Windows

Linked PRs
  • gh-146395

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

concurrent.futures.Executor.map とその buffersize 引数を使用して、issue にある両方のシャットダウンシナリオを再現します。Executor.map の反復処理パスを調査し、その後、シャットダウン後の例外が発生する前にバッファリングされた結果を yield するケースのテストカバレッジを追加し、既存の例が説明どおりに動作することを確認します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
backend
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
30/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。