【发布时间】:2019-10-29 18:43:48
【问题描述】:
1.为什么以下使用 concurrent.futures 模块的 Python 代码永远挂起?
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()
调用引发了一个不可见的异常[Errno 24] Too many open files(要查看它,请将executor.submit(super().f) 行替换为print(executor.submit(super().f).exception()))。
但是,将 ProcessPoolExecutor 替换为 ThreadPoolExecutor 会按预期打印“调用”。
2。为什么以下使用 multiprocessing.pool 模块的 Python 代码会引发异常 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()
但是,将 Pool 替换为 ThreadPool 会按预期打印“调用”。
环境:CPython 3.7、MacOS 10.14。
【问题讨论】:
标签: python pickle python-multiprocessing process-pool