Python_进程(一)

来源:互联网 发布:dt大数据 编辑:程序博客网 时间:2024/05/17 22:07

前言:当你的女朋友喊你去逛街,而你现在正在开开心心的打游戏,作为游戏迷的你是不是非常的苦恼呢。如果自己会分身术多好,一个陪女朋友逛街,一个打游戏。既不惹女朋友生气,又能打游戏,既高效,又节省时间。

虽然在现实世界中不能做到,但是在代码的世界里这个可以做到。

fork分身术(fork进程)

在Python中的os模块中封装了系统常用的系统调用,当然fork也在其中。使用fork可以轻松的创建子进程。

需要注意的是fork函数  只能在mac、unix、linux上运行在windows上不能。

import osimport timepid = 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 ospid =os.fork()if pid==0:    print("我是子进程%s,我的父进程是%s"%(os.getpid(),os.getppid()))else:    print("我是父进程%s,我的子进程是%s" % (os.getpid(), pid))

创建多个fork

import ospid =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 oswhile 1:    os.fork()
使用while 1创建无限循环来让fork创建进程,最终会导致程序崩溃。

进程的回收os.wait()

使用os.wait()方法用来回收子进程占用的资源

import ospid =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 osNUM = 1pid = os.fork()if pid ==0:    NUM+=1    print(NUM)else:    NUM += 2    print(NUM)
输出结果

3
2

在多进程中,每个进程的所有数据包括全局变量都各自拥有一份,互不影响。


原创粉丝点击