New GitHub issue #119104 from hcording:<br>
<hr>
<pre>
# Bug report
### Bug description:
When using multiprocessing.Manager with concurrent.futures.ProcessPoolExecutor, there is a particular ordering of the context managers that results in multiprocessing.managers.py hanging in the method `serve_forever`, forever. This can be triggered by raising a KeyboardInterrupt while the child process(es), here `something`, are busy. The ordering that leads to the bug is: Manager first, then ProcessPoolExecutor inside.
```python
import multiprocessing
from concurrent.futures import ProcessPoolExecutor
from time import sleep
def something():
sleep(10)
# Uncomment one of the following blocks
### Works correctly:
# # Interrupt with CTRL+C while `something` is busy
# # Takes just one KeyboardInterrupts to terminate fully
# with ProcessPoolExecutor() as executor:
# futures = []
# with multiprocessing.Manager() as manager:
# futures.append(executor.submit(something))
#
# for f in futures:
# f.result()
### Doesn't work correctly, will hang often, try it a few times:
# # Interrupt with CTRL+C while `something` is busy
# # Takes one KeyboardInterrupts to get stuck, and another to terminate fully
# with multiprocessing.Manager() as manager:
# with ProcessPoolExecutor() as executor:
# futures = [executor.submit(something)]
#
# for f in futures:
# f.result()
```
I am not too familiar with the exact inner workings of these two context managers, but as a user, there was at least nothing to make me aware that the 2nd example is bad. If it's not a bug, and just incorrect ordering, perhaps `ProcessPoolExecutor` could raise an exception or print a warning that it shouldn't be used inside a `Manager` context in such a way.
### CPython versions tested on:
3.9, 3.10, 3.11, 3.12
### Operating systems tested on:
Linux
</pre>
<hr>
<a href="https://github.com/python/cpython/issues/119104">View on GitHub</a>
<p>Labels: type-bug</p>
<p>Assignee: </p>