为什么我不能在提交给 ProcessPoolExecutor 的可调用文件中创建/访问期货?
Why can I not create / access futures in callables submitted to ProcessPoolExecutor?
为什么这段代码适用于线程而不适用于进程?
import concurrent.futures as f
import time
def wait_on_b():
time.sleep(2)
print(b.result())
return 5
def wait_5():
time.sleep(2)
return 6
THREADS = False
if THREADS:
executor = f.ThreadPoolExecutor()
else:
executor = f.ProcessPoolExecutor()
a = executor.submit(wait_on_b)
b = executor.submit(wait_5)
print(a.result()) # works fine if THREADS, BrokenProcessPool otherwise
docs 警告:
Calling Executor or Future methods from a callable submitted to a ProcessPoolExecutor will result in deadlock.
文档似乎没有提到引发异常,所以这是否意味着 ProcessPoolExecutor
以某种方式发现了死锁并通过终止两个进程来解决它?
更重要的是,为什么这种死锁对于进程来说是不可避免的(并且对于线程来说是可以避免的),如果我想在 futures 中使用多个进程而不受如此限制,那么解决方法是什么?
使用线程时,内存在所有线程之间共享,这就是为什么 wait_on_b 可以访问 b.
使用进程,为每个进程创建新内存space(旧内存的副本在fork模式 ) 所以你会得到一份 b 的副本,但管道损坏了,因为它不是 real b (只是一个副本)
顺便说一句:在windows上没有fork,所以b(内存是全新的)不存在你会得到
concurrent.futures.process._RemoteTraceback:
"""
Traceback (most recent call last):
File "C:\Anaconda3\lib\concurrent\futures\process.py", line 175, in _process_worker
r = call_item.fn(*call_item.args, **call_item.kwargs)
File "C:\Users\yglazner\My Documents\LiClipse Workspace\anaconda_stuff\mproc.py", line 5, in wait_on_b
print(b.result())
NameError: name 'b' is not defined
"""
为什么这段代码适用于线程而不适用于进程?
import concurrent.futures as f
import time
def wait_on_b():
time.sleep(2)
print(b.result())
return 5
def wait_5():
time.sleep(2)
return 6
THREADS = False
if THREADS:
executor = f.ThreadPoolExecutor()
else:
executor = f.ProcessPoolExecutor()
a = executor.submit(wait_on_b)
b = executor.submit(wait_5)
print(a.result()) # works fine if THREADS, BrokenProcessPool otherwise
docs 警告:
Calling Executor or Future methods from a callable submitted to a ProcessPoolExecutor will result in deadlock.
文档似乎没有提到引发异常,所以这是否意味着 ProcessPoolExecutor
以某种方式发现了死锁并通过终止两个进程来解决它?
更重要的是,为什么这种死锁对于进程来说是不可避免的(并且对于线程来说是可以避免的),如果我想在 futures 中使用多个进程而不受如此限制,那么解决方法是什么?
使用线程时,内存在所有线程之间共享,这就是为什么 wait_on_b 可以访问 b.
使用进程,为每个进程创建新内存space(旧内存的副本在fork模式 ) 所以你会得到一份 b 的副本,但管道损坏了,因为它不是 real b (只是一个副本)
顺便说一句:在windows上没有fork,所以b(内存是全新的)不存在你会得到
concurrent.futures.process._RemoteTraceback:
"""
Traceback (most recent call last):
File "C:\Anaconda3\lib\concurrent\futures\process.py", line 175, in _process_worker
r = call_item.fn(*call_item.args, **call_item.kwargs)
File "C:\Users\yglazner\My Documents\LiClipse Workspace\anaconda_stuff\mproc.py", line 5, in wait_on_b
print(b.result())
NameError: name 'b' is not defined
"""