一:多进程概念
python中实现多进程是通过os.fork()这个函数来实现,这个函数和操纵系统本身结合的非常紧密,windows下就无法使用os.fork()这个函数。python中的os.fork()被调用后就会立即生成一个子进程,是通过copy父进程的地址空间和资源来实现子进程的创建,同时这个函数在子进程中返回的是0,在父进程中返回的是子进程的PID。子进程在结束父进程还未结束的时候,子进程这段时间是处于Zombie状态,可以通过ps命令查看到进程的状态,Zombie的目的是为了在子进程结束的时候可以保存一些结束信息供父进程来收集。
二:多进程的简单实现
#!/usr/bin/env python
import os
def task(id):
print "work %d" %id
pid = os.fork()
if pid == 0:
print "I am a child"
task(1)
else:
print "I am father child"
执行结果如下:
I am father child
I am a child
work 1
多次执行上面的例子可能结果的顺序会不一样,子进程和父进程执行的顺序是无法预估的。
os.fork()执行后父进程继续往下执行,子进程也会从os.fork()语句之后开始运行,并且子进程拥有父进程所有的变量,但是两者是独立的。
#!/usr/bin/env python
import os
import time
def task(id):
print "work %d" %id
var = 10
pid = os.fork()
if pid == 0:
print "I am a child"
var = 9
task(1)
else:
print "I am father child"
time.sleep(3)
print var
结果是:
I am father child
I am a child
work 1
10
上面这段代码演示了子进程和父进程的var这个变量是独立,在子进程中改变了var变量的值,并不影响父进程中的var变量值,两者是独立的,为了防止父进程先执行,子进程后执行,所以让父进程sleep(3)了一会再输出var的值。子进程结束后,但是父进程还没有结束的时候,子进程是出于Zombie状态的,这个需要父进程去收集子进程的信息释放子进程。如果父进程结束了子进程没有结束,那么子进程就会寄托给pid为1的进程来管理。
#!/usr/bin/env python
import os