天天看点

你懵逼的fork多进程编程

基于应用层fork的多进程编程

## ***代码演示:***
import os
pid=os.fork()
if pid<0:   	 
   print("创建进程失败")
elif pid==0:    
   print("这是新的进程")
else:    
   print("这是老进程")
   
print("进程结束!!")
           

####### 解释1.:

上述代码正常理解会打印符合条件的一条语句。但是,这样理解是错误的。

正常打印:

这是老进程
进程结束!!
这是新的进程
进程结束!!
           

####### 解释2.:

子进程会复制父进程全部内存空间,从fork下一句开始执行。父子进程各自独立运行,运行顺序不一定。

父进程 子进程
import os import os
pid=os.fork() ##执行完这句,创建子进程 pid=os.fork()##子进程不执行这一句
if pid<0: if pid<0:
print(“创建进程失败”) print(“创建进程失败”)
elif pid==0: elif pid==0:
print(“这是新的进程”) print(“这是新的进程”)
else: else:
print(“这是老进程”) print(“这是老进程”)
print(“进程结束!!”) print(“进程结束!!”)

所以才会打印成上述的语句!!!

解释这一句话:

进程之间的运行互不影响,各自独立
 每个进程拥有独立的空间,各自使用自己空间资源
           
from time import sleep
import os
a=1#定义全局变量
pid=os.fork()
if pid<0:
	print("Error")
elif pid==0:
	print("这是子进程")
	print("a=",a)
	a=1000	
else:
	sleep(2)
	print("这是父进程")
	print("a=",a)
打印结果:
	这是子进程
	a= 1
	这是父进程
	a: 1
           

解释:

因为全局变量a=1,子进程复制了父进程中的所有代码,所有会打印:

这是子进程
a= 1
           

虽然在子进程中修改了a的值,打印父进程中的内容时,还是打印:

这是父进程
 a: 1
解释就是这句话:
	每个进程拥有独立的空间,各自使用自己空间资源
           

补:

进程相关函数

os.getpid()
功能: 获取一个进程的PID值返回值:
      返回当前进程的PID
os.getppid()	
功能: 获取父进程的PID号返回值: 
       返回父进程PID
           
孤儿和僵尸的故事 敬请期待!!!