前言:当你的女朋友喊你去逛街,而你现在正在开开心心的打游戏,作为游戏迷的你是不是非常的苦恼呢。如果自己会分身术多好,一个陪女朋友逛街,一个打游戏。既不惹女朋友生气,又能打游戏,既高效,又节省时间。
虽然在现实世界中不能做到,但是在代码的世界里这个可以做到。
fork分身术(fork进程)
在Python中的os模块中封装了系统常用的系统调用,当然fork也在其中。使用fork可以轻松的创建子进程。
需要注意的是fork函数 只能在mac、unix、linux上运行在windows上不能。
import os
import time
pid = os.fork()
if pid ==0:
while 1:
print("1")
time.sleep(1)
else:
while 1:
print("2")
time.sleep(1)
显示结果是
1和2 同时打印出来。这就是使用fork函数创建了一个子进程
注意:
1、程序执行到os.fork()时,操作系统会创建一个新的进程(子进程),然后复制父进程中所有的信息到子进程中。
2、父进程、子进程都会从fork函数中得到一个返回值,在子进程中这个值一定是0,而父进程中是子进程的id号。
3、fork()函数调用一次,返回两次,分别返回给父进程、子进程。
4、子进程永远返回0,父进程返回子进程的id。因为一个父进程可以创建很多子进程,所以父进程要记录下每个子进程的ID,而子进程只需要使用getppid()就可以拿到父进程的ID。
下面的代码演示(创建两个进程)
import os
pid =os.fork()
if pid==0:
print("我是子进程%s,我的父进程是%s"%(os.getpid(),os.getppid()))
else:
print("我是父进程%s,我的子进程是%s" % (os.getpid(), pid))
创建多个fork
import os
pid =os.fork()
if pid==0:
print("1")
else:
print("2")
pid =os.fork()
if pid==0:
print("11")
else:
print("22")
输出结果:
2
1
22
22
11
11
输出结果和你想象中的一样么?
如果不明白请看下面这张图
现在已经是4个进程。
fork炸弹
import os
while 1:
os.fork()
使用while 1创建无限循环来让fork创建进程,最终会导致程序崩溃。
进程的回收os.wait()
使用os.wait()方法用来回收子进程占用的资源
import os
pid =os.fork()
if pid==0:
print("我是子进程%s,我的父进程是%s"%(os.getpid(),os.getppid()))
else:
print("我是父进程%s,我的子进程是%s" % (os.getpid(), pid))
pid,result = os.wait()
print("父进程回收的子进程pid:%s, result:%s" % (pid, result))
print("回收完成")
wait()会有两个返回值:1、子进程的编号。2、子进程退出时的状态(0表示正常退出)
多进程修改全局变量
import os
NUM = 1
pid = os.fork()
if pid ==0:
NUM+=1
print(NUM)
else:
NUM += 2
print(NUM)
输出结果
3
2
在多进程中,每个进程的所有数据包括全局变量都各自拥有一份,互不影响。