Python 多进程 multiprocessing

多进程

进程是由进程创建的,被创建的进程称为该进程的子进程,每一个进程可以各自执行自己的任务,互不干扰。

软件运行的背后,其实都是一个个的进程,这些进程有属于自己的进程编号,标示着所属的任务和任务的从属关系

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 进程是当前进程的字进程
# 父进制被关闭后,子进程仍然可以存在和运行,这样的进程被称为孤儿进程

多核CPU

假设我们主机是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()

执行Shell

Python和Shell的交互,可以通过subprocess这个内置模块实现,它能帮助我们直接执行Shell命令,并且获取返回的结果。

import subprocess
ret = subprocess.getstatusoutput('date')

>>> ret
(0, '2018年 6月 9日 星期六 14时08分48秒 CST') # 结果是元组类型 

# 这么模块还支持控制Shell进程的输入输出等... 但如果是比较复杂的Shell脚本,还是推荐直接用Shell编写,然后Python调用实现起来更加方便

使用多进程的模型实现多任务,因为进程间的内存空间是各自独立的,所以一般会比较稳定,缺点是消耗内存

Python 教程 Python 入门 Python 时间 Python JSON