gpt4 book ai didi

python - 为什么我无法在提交给 ProcessPoolExecutor 的可调用对象中创建/访问 future?

转载 作者:太空宇宙 更新时间:2023-11-03 16:08:11 25 4
gpt4 key购买 nike

为什么这段代码适用于线程而不适用于进程?

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 以某种方式发现了死锁并通过终止两个进程来解决它?

更重要的是,为什么这种死锁对于进程来说是不可避免的(并且对于线程来说是可以避免的),如果我想在 future 中使用多个进程而不受到如此限制,那么解决方法是什么?

最佳答案

使用线程时,所有线程之间内存共享,这就是 wait_on_b 可以访问 b 的原因。

使用进程时,会为每个进程创建一个新内存空间(在fork模式下旧内存空间的副本),因此您将获得b的副本 管道破损,因为它不是真实 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
"""

关于python - 为什么我无法在提交给 ProcessPoolExecutor 的可调用对象中创建/访问 future?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39561925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com