Skip to content

InterpreterPoolExecutor does not work as replacement of ThreadPoolExecutor. #136603

Description

@corona10

According to PEP-734, it should work as same as ThreadPoolExecutor, but it looks not.

Code

importconcurrent.futuresfromconcurrent.futuresimportInterpreterPoolExecutor, ThreadPoolExecutordeffib(n):
ifn<2:
returnnreturnfib(n-1) +fib(n-2)
withInterpreterPoolExecutor(max_workers=5) asexecutor:
futures= {executor.submit(fib, n): nforninrange(10)}
forfutureinconcurrent.futures.as_completed(futures):
n=futures[future]
data=future.result()
print(f"fib({n}): {data}")

Execution (InterpreterPoolExecutor)

Exception: AttributeError: module '__main__' has no attribute 'fib'
The above exception was the direct cause of the following exception:
concurrent.interpreters.NotShareableError: object could not be unpickled
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/Users/xxxx/oss/cpython/op.py", line 14, in <module>
data = future.result()
File "/Users/xxxx/oss/cpython/Lib/concurrent/futures/_base.py", line 443, in resultreturnself.__get_result()
~~~~~~~~~~~~~~~~~^^
File "/Users/xxxx/oss/cpython/Lib/concurrent/futures/_base.py", line 395, in __get_resultraiseself._exception
File "/Users/xxxx/oss/cpython/Lib/concurrent/futures/thread.py", line 86, in run
result = ctx.run(self.task)
File "/Users/denny.na/oss/cpython/Lib/concurrent/futures/interpreter.py", line 85, in runreturnself.interp.call(do_call, self.results, *task)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/xxxx/oss/cpython/Lib/concurrent/interpreters/__init__.py", line 233, in callreturnself._call(callable, args, kwargs)
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/xxxx/oss/cpython/Lib/concurrent/interpreters/__init__.py", line 215, in _call
res, excinfo = _interpreters.call(self._id, callable, args, kwargs, restrict=True)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^concurrent.interpreters.NotShareableError: args not shareable

Execution (ThreadPoolExecutor)

fib(0): 0
fib(7): 13
fib(2): 1
fib(6): 8
fib(1): 1
fib(4): 3
fib(3): 2
fib(5): 5
fib(9): 34
fib(8): 21

Metadata

Metadata

Labels

3.14bugs and security fixesstdlibStandard Library Python modules in the Lib/ directorytopic-subinterpreterstype-bugAn unexpected behavior, bug, or error

Projects

Status
Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions