所以if pid==0表示这时候cpu已经切换到子进程了,相当于我们在新生成的这条路上面做事(返回任务id);else表示又跑到原来的路上做事了,在这里我们记录下新生成的子进程,这时候children[pid]=i里面的pid就是新生成的子进程的pid,而 i 就是刚才在子进程里面我们返回的任务id(其实就是用来代码子进程的id号)。
1
fori inrange(num_processes):
2
id=start_child(i)
3
ifidisnotNone:
4
returnid
if id is not None表示如果我们在刚刚生成的那个子进程的上下文里面,那么就什么都不干,直接返回子进程的任务id就好了,啥都别想了,也别再折腾。如果还在父进程的上下文的话那么就继续生成子进程。
01
num_restarts =0
02
whilechildren:
03
try:
04
pid, status =os.wait()
05
exceptOSError, e:
06
ife.errno ==errno.EINTR:
07
continue
08
raise
09
ifpid notinchildren:
10
continue
11
id=children.pop(pid)
12
ifos.WIFSIGNALED(status):
13
logging.warning("child %d (pid %d) killed by signal %d, restarting",
14
id, pid, os.WTERMSIG(status))
15
elifos.WEXITSTATUS(status) !=0:
16
logging.warning("child %d (pid %d) exited with status %d, restarting",