进程是由进程创建的
,被创建的进程称为该进程的子进程
,每一个进程可以各自执行自己的任务,互不干扰。
软件运行的背后,其实都是一个个的进程,这些进程有属于自己的进程编号
,标示着所属的任务和任务的从属关系
。
multiprocessing
是python内置的一个进程管理
模块,我们可以通过这个模块实现多进程
。
from multiprocessing import Process
from time import sleep
# 死循环任务 | 每隔一秒输出一个 word
def AB(word):
while True:
sleep(1) # 暂停1秒
print(word)
# 定义任务 | target 发射任务的函数 | args 函数的参数
A = Process(target=AB, args=('A'))
B = Process(target=AB, args=('B'))
# 启动任务
A.start()
# A.join() 同步 | 等待A任务执行完毕后B任务才执行 | 尝试开启看看效果
B.start()
# 结果
A
B
A
B
A
B
...
# 如果想结束某个任务,可以使用 terminate 方法
# 例如 A.terminate()
from multiprocessing import Process
import os
# 当前进程号 os.getpid()
# 父进程号 os.getppid()
# 进程关系
def run():
print('run current process %s' % (os.getpid()))
print('run parent process %s' % (os.getppid()))
print('current process %s' % (os.getpid()))
run = Process(target=run)
run.start()
# 结果
current process 1661
run current process 1663
run parent process 1661
# run 进程是当前进程的字进程
# 父进制被关闭后,子进程仍然可以存在和运行,这样的进程被称为孤儿进程
假设我们主机是4核的CPU
,当我们使用一个进程的程序的执行任务时,最多只能占用1核CPU
,也就是最高能使用CPU 1/4
的性能。而如果我们启动了4个进程交替执行任务,那么就可以占满4个核
,充分的利用了计算机的资源。
import multiprocessing
# cpu核数
>>> multiprocessing.cpu_count()
4
# 根据cpu核数启动同等进程
for i in range(multiprocessing.cpu_count()):
t = multiprocessing.Process(target=f)
t.start()
Python和Shell的交互,可以通过subprocess
这个内置模块实现,它能帮助我们直接执行Shell命令
,并且获取返回的结果。
import subprocess
ret = subprocess.getstatusoutput('date')
>>> ret
(0, '2018年 6月 9日 星期六 14时08分48秒 CST') # 结果是元组类型
# 这么模块还支持控制Shell进程的输入输出等... 但如果是比较复杂的Shell脚本,还是推荐直接用Shell编写,然后Python调用实现起来更加方便
使用多进程的模型实现多任务,因为进程间的内存空间是各自独立的,所以一般会比较稳定
,缺点是消耗内存
。