前言:当你的女朋友喊你去逛街,而你现在正在开开心心的打游戏,作为游戏迷的你是不是非常的苦恼呢。如果自己会分身术多好,一个陪女朋友逛街,一个打游戏。既不惹女朋友生气,又能打游戏,既高效,又节省时间。
虽然在现实世界中不能做到,但是在代码的世界里这个可以做到。
在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))2 1 22 22 11 11
输出结果和你想象中的一样么?
如果不明白请看下面这张图
现在已经是4个进程。
fork炸弹
import os while 1: os.fork() 使用while 1创建无限循环来让fork创建进程,最终会导致程序崩溃。使用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表示正常退出)
3 2
在多进程中,每个进程的所有数据包括全局变量都各自拥有一份,互不影响。