当运行一个程序时,操作系统会创建一个进程。它会使用系统资源(CPU、内存和磁盘空间)和操作系统内核中的数据结构(文件、网络连接、用量统计等)。进程之间是互相隔离的,即一个进程既无法访问其他进程的内容,也无法操作其他进程。

操作系统会跟踪所有正在运行的进程,给每个进程一小段运行时间,然后切换到其他进程,这样既可以做到公平又可以响应用户操作。可以在图形界面中查看进程状态,在Mac OS X上可以使用活动监视器,在Windows上可以使用任务管理器。

可以自己编写城区来获取进程信息。标准库模块os提供了一些常用的获取系统信息的函数。举例来说,下面的函数会获取正在运行的python解释器的进程号和当前工作目录。

>>> import os
>>> os.getpid()
4988
>>> os.getcwd()
'C:Userslpt20'

1. 使用subprocess创建进程

到目前为止,看到的左右程序都是单进程程序。可以使用python标准库中的subprocess模块来启动和终止其他程序。如果只是想在shell中运行其他程序并获取它的输出(标准输出和标准错误输出),可以使用getoutput()函数。

>>> import subprocess
>>> ret=subprocess.getoutput('date')
>>> ret
'当前日期: 2018/06/23 周六 n输入新日期: (年月日) '

在进程执行完毕之前,获取不到任何内容。如果需要调用一些比较耗时的程序,可以使用11.1节提到的并发。因为getoutput()的参数是一个字符串,可以表示一个完整的shell命令,所以可以在李敏使用参数、管道、I/O重定向<和>,等等;

2. 使用multiprocessing创建进程

import multiprocessing
from multiprocessing import Process
import os
def do_this(what):
 whoami(what)
def whoami(what):
 print("Process %s says: %s" % (os.getpid(),what))
if __name__=="__main__":
 whoami("我是主程序")
 for n in range(4):
 p=Process(target=do_this,args=("我是主程序 %s" % n,))
 p.start()

3. 使用terminate()终止进程

import multiprocessing
from multiprocessing import Process
import time
import os
def whoami(name):
 print("我是 %s,in process %s" % (name,os.getpid()))
def loopy(name):
 whoami(name)
 start=1
 stop=1000000
 for num in range(start,stop):
 print("tNumber %s of %s,Honk!" % (num,stop))
 time.sleep(1)
if __name__=="__main__":
 whoami("main")
 p=Process(target=loopy,args=("loopy",))
 p.start()
 time.sleep(5)
 p.terminate()