gpt4 book ai didi

python - 将进程附加到列表(但不对其进行任何操作)会改变程序行为

转载 作者:太空狗 更新时间:2023-10-29 21:11:25 24 4
gpt4 key购买 nike

在下面的程序中,当我将进程追加到列表中时(看似毫无意义的事情),它按预期运行。但是如果我删除追加,进程析构函数甚至在运行之前被调用多次。只有 n 构造,但 (n)(n+1)/2 (其中 n 是进程数)破坏。这让我相信每个进程都被复制到每个新进程中,然后立即销毁。也许这就是多处理模块的工作方式。这是有道理的,因为每个进程都是当前进程的一个分支。但是,追加到列表中有什么意义呢?为什么仅仅这样做就可以阻止这种行为?

这是测试和示例输出:

import multiprocessing

class _ProcSTOP:
pass

class Proc(multiprocessing.Process):

def __init__(self, q, s):
s.i += 1
self._i = s.i
self._q = q
print('constructing:', s.i)
super().__init__()

def run(self):
dat = self._q.get()

while not dat is _ProcSTOP:
self._q.task_done()
dat = self._q.get()

self._q.task_done()
print('returning: ', self._i)

def __del__(self):
print('destroying: ', self._i)



if __name__ == '__main__':

q = multiprocessing.JoinableQueue()
s = multiprocessing.Manager().Namespace()
s.i = 0
pool = []

for i in range(4):
p = Proc(q, s)
p.start()
pool.append(p) # This is the line to comment

for i in range(10000):
q.put(i)

q.join()

for i in range(4):
q.put(_ProcSTOP)

q.join()

print('== complete')

带有附加的示例输出:

constructing: 1
constructing: 2
constructing: 3
constructing: 4
returning: 3
returning: 2
== complete
returning: 1
returning: 4
destroying: 4
destroying: 3
destroying: 2
destroying: 1

没有附加的示例输出:

constructing: 1
constructing: 2
constructing: 3
destroying: 1
constructing: 4
destroying: 1
destroying: 2
destroying: 3
destroying: 1
destroying: 2
returning: 1
returning: 4
returning: 2
== complete
returning: 3
destroying: 1
destroying: 3
destroying: 2
destroying: 4

最佳答案

将对象添加到列表将防止它在子进程中被删除,因为在 fork 后它将调用“os._exit()”而不是清除整个堆栈

相关代码在multiprocessing/forking.py(Popen的构造函数,在"p.start()"上调用)

 self.pid = os.fork()
if self.pid == 0:
if 'random' in sys.modules:
import random
random.seed()
code = process_obj._bootstrap()
sys.stdout.flush()
sys.stderr.flush()
os._exit(code)

_bootstrap 在哪里设置新进程并调用“运行”(代码在 multiprocessing/process.py 中)

关于python - 将进程附加到列表(但不对其进行任何操作)会改变程序行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8023127/

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