1. Why does the following Python code using the concurrent.futures
module hang forever?
import concurrent.futures
class A:
def f(self):
print("called")
class B(A):
def f(self):
executor = concurrent.futures.ProcessPoolExecutor(max_workers=2)
executor.submit(super().f)
if __name__ == "__main__":
B().f()
The call raises an invisible exception [Errno 24] Too many open files
(to see it, replace the line executor.submit(super().f)
with print(executor.submit(super().f).exception())
).
However, replacing ProcessPoolExecutor
with ThreadPoolExecutor
prints "called" as expected.
2. Why does the following Python code using the multiprocessing.pool
module raise the exception AssertionError: daemonic processes are not allowed to have children
?
import multiprocessing.pool
class A:
def f(self):
print("called")
class B(A):
def f(self):
pool = multiprocessing.pool.Pool(2)
pool.apply(super().f)
if __name__ == "__main__":
B().f()
However, replacing Pool
with ThreadPool
prints "called" as expected.
Environment: CPython 3.7, MacOS 10.14.