Skip to content

concurrent.futures.Executor.map does not cancel the currently waited on future #95166

Description

@graingert

Bug report

importcontextlibimportfunctoolsimportconcurrent.futuresimportthreadingimportsysdeffn(num, stop_event):
ifnum==1:
stop_event.wait()
return"done 1"ifnum==2:
return"done 2"defmain():
stop_event=threading.Event()
log= []
withconcurrent.futures.ThreadPoolExecutor(max_workers=1) aspool:
defprint_n_wait(ident):
log.append(f"{ident=} started")
try:
stop_event.wait()
finally:
log.append(f"{ident=} stopped")
fut=pool.submit(print_n_wait, ident="first")
try:
withcontextlib.closing(pool.map(print_n_wait, ["second", "third"], timeout=1)) asgen:
try:
next(gen)
exceptconcurrent.futures.TimeoutError:
print("timed out")
else:
raiseRuntimeError("timeout expected")
finally:
stop_event.set()
assertlog== ["ident='first' started", "ident='first' stopped"], f"{log=} is wrong"if__name__=="__main__":
sys.exit(main())

result in:

timed out
Traceback (most recent call last):
File "/home/graingert/projects/executor_map.py", line 45, in <module>
sys.exit(main())
File "/home/graingert/projects/executor_map.py", line 42, in main
assert log == ["ident='first' started", "ident='first' stopped"], f"{log=} is wrong"
AssertionError: log=["ident='first' started", "ident='first' stopped", "ident='second' started", "ident='second' stopped"] is wrong

Your environment

  • CPython versions tested on:
  • Operating system and architecture:

Metadata

Metadata

Assignees

No one assigned

    Labels

    type-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions