fork() 创建的进程将在 python 中做什么?
what will process created by fork() do in python?
我写了下面的代码,但我不太明白它是如何工作的:
NUM=8
def timec():
x=1000000
while x>0:
x-=1
pid_children=[]
start_time=time.time()
for i in range(NUM):
pid=os.fork()
if pid==0:
timec()
os._exit(0)
else:
pid_children.append(pid)
for j in pid_children:
os.waitpid(j,0)
print(time.time()-start_time)
我无法理解子进程从哪里开始或从哪里结束。
另一个问题是 waitpid()
方法会等待子进程完成它的工作,还是会在调用后立即 return?
当调用os.fork()
时,程序分裂成两个完全独立的程序。在child, os.fork()
returns 0. 在parent, os.fork()
returns child的进程id.
key与os.fork()
的区别在于,它不会创建一个共享原始线程内存的新线程,而是创建一个全新的进程。 新进程有其 parent 的内存副本。 parent 中的更新不会反映在 child 中,[= =65=]没有体现在parent!每个人都有自己的 状态。
鉴于这种情况,以下是您具体问题的答案:
child 进程从哪里开始?
pid = os.fork()
这将生成超过 NUM
个进程,因为在第一次迭代后,for 循环内将有 2 个进程,每个进程将分叉成 2 个进程,在第二次迭代后总共产生 4 个进程。 总共将创建 256 (2^8) 个进程!
child 进程在哪里结束?
部分退出时间:
os._exit(0)
其他的会在文件末尾退出。那是因为你在循环的后续迭代中覆盖了 pid,所以一些 children 成为孤儿(并且永远不会 运行 timec()
)。
pid_children
将始终只有一个进程。那是因为程序的整个状态是分叉的,每个分叉(都有自己的列表副本)只向列表添加一个元素。
waitpid是做什么的?
os.waitpid(pid)
将阻塞,直到 pid 为 pid
的进程完成。
我写了下面的代码,但我不太明白它是如何工作的:
NUM=8
def timec():
x=1000000
while x>0:
x-=1
pid_children=[]
start_time=time.time()
for i in range(NUM):
pid=os.fork()
if pid==0:
timec()
os._exit(0)
else:
pid_children.append(pid)
for j in pid_children:
os.waitpid(j,0)
print(time.time()-start_time)
我无法理解子进程从哪里开始或从哪里结束。
另一个问题是 waitpid()
方法会等待子进程完成它的工作,还是会在调用后立即 return?
当调用os.fork()
时,程序分裂成两个完全独立的程序。在child, os.fork()
returns 0. 在parent, os.fork()
returns child的进程id.
key与os.fork()
的区别在于,它不会创建一个共享原始线程内存的新线程,而是创建一个全新的进程。 新进程有其 parent 的内存副本。 parent 中的更新不会反映在 child 中,[= =65=]没有体现在parent!每个人都有自己的 状态。
鉴于这种情况,以下是您具体问题的答案:
child 进程从哪里开始?
pid = os.fork()
这将生成超过 NUM
个进程,因为在第一次迭代后,for 循环内将有 2 个进程,每个进程将分叉成 2 个进程,在第二次迭代后总共产生 4 个进程。 总共将创建 256 (2^8) 个进程!
child 进程在哪里结束?
部分退出时间:
os._exit(0)
其他的会在文件末尾退出。那是因为你在循环的后续迭代中覆盖了 pid,所以一些 children 成为孤儿(并且永远不会 运行 timec()
)。
pid_children
将始终只有一个进程。那是因为程序的整个状态是分叉的,每个分叉(都有自己的列表副本)只向列表添加一个元素。
waitpid是做什么的?
os.waitpid(pid)
将阻塞,直到 pid 为 pid
的进程完成。