基于应用层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