gpt4 book ai didi

python - 尝试在 python 中使用 main 理解多处理

转载 作者:太空宇宙 更新时间:2023-11-03 14:31:36 24 4
gpt4 key购买 nike

使用下面的代码我得到了奇怪的输出:

import  sys 
from multiprocessing import Process
import time
from time import strftime

now =time.time()
print time.strftime("%Y%m%d %H:%M:%S", time.localtime(now))

fr= [1,2,3]
for row in fr:
print 3

print 1

def worker():
print 'worker line'
time.sleep(1)
sys.exit(1)

def main():
print 'start worker'
Process(target=worker, args=()).start()
print 'main line'

if __name__ == "__main__":
start_time = time.time()
main()
end_time = time.time()
duration = end_time - start_time
print "Duration: %s" % duration

输出是:

20120324 20:35:53
3
3
3
1
start worker
main line
Duration: 0.0
20120324 20:35:53
3
3
3
1
worker line

我想我会得到这个:

20120324 20:35:53
3
3
3
1
start worker
worker line
main line
Duration: 1.0

为什么要运行两次?在 WinX64 上使用 python 2.7:

20120324 20:35:53
3
3
3
1
worker line

最佳答案

这个问题基本上是因为multiprocessing 确实是为运行在posix 系统上而设计的,一个带有fork(2) 的系统。系统调用。在这些操作系统上,进程可以一分为二,子进程神奇地从父进程克隆状态,然后两个进程在同一个地方恢复运行,子进程现在有一个新的进程 ID。在这种情况下,multiprocessing 可以安排某种机制根据需要将状态从父级传送到子级,并确保子级已经拥有大部分所需的 python 状态。

Windows 没有fork()

因此 multiprocessing 必须收拾残局。这基本上涉及启动一个运行多处理子脚本的全新 python 解释器。几乎立即, parent 会要求 child 使用处于 parent 状态的东西,因此 child 将不得不从头开始重新创建该状态,通过将您的脚本导入 child

因此,在您的脚本中导入时发生的任何事情都会发生两次,一次在父级中,一次在子级中,因为它重新创建了为父级服务所需的 python 环境。

关于python - 尝试在 python 中使用 main 理解多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9857006/

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