python 是一种非常流行的编程语言,但是python 的效率却并不是非常的理想,这时候就非常有必要使用多进程来提高python 的运行效率。

导入多进程的模块

from multiprocessing import Process      # 多进程模块
from multiprocessing import current_process    # 获取当前进程号
import time

创建多个进程

方式一:

# 定义一个多进程运行的函数
def fun(n):
    time.sleep(3)             # 设置一个延时观察多进程的运行情况
    print("{}".format(n))
    print("当前进程号:",current_process().pid)    # 打印当前的进程号

if __name__ = "__main__":
    p = Process(target=fun,args=(3,))         # 输入的参数设置,如果只是一个参数时候必须加上逗号,不然会被解析为一个字符串或者数字
    p.start()         # 创建一个进程的内存空间
    p.join()          # 阻塞进程,等待子进程运行完成之后,再继续运行朱金城代码
    print("主进程运行结束,进程号{}".format(current_process().pid))   # 查看主进程号

方式二:

创建多个进程

class myProcess(Process):        # 继承多进程的模块
    def run(self):               # 替换多进程类中的run 函数
        print("start myProcess")
        time.sleep(2)
        print("end myProcess")
       
if __name__ = "__main__":
    p = myProcess()               # 创建一个子进程
    p.start()
    p.join()                       # 阻塞子进程等待子进程运行结束
    print("主进程运行结束")

ps: 查看当前进程号的另一种方法

import os
os.getpid();              # 当前进程的进程号
os.getppid();             # 当前进程的父进程的进程号

进程之间数据一般不能相互交互,需要相互交互时候,需要使用到第三方介质或者导入其他第三方库进行获取。

总结:
1.多个进程在内存中分别拥有着不同的区域,进程之间互不影响,同时也导致是数据不能共享。
2.多个进程分配到内存之后,几乎同时运行,不需要等待前面的结束才进行后面的进程,异步执行代码。
3、多进程由于同时运行,导致在读取数据以及修改数据时候会出现问题,添加互斥锁,使得一个时间点内只能有一个进程在修改数据,不会导致数据出现逻辑上的错误(将并发数据转变成为串行,牺牲效率,但是保证数据的安全)

from multiprocessing import Process, Lock   
import json

def change(i):
    with open("data.json","w") as f:
        json.dump(f,)            # 修改逻辑数据

def run(i,mutex):
    mutex.acquire()           # 抢锁
    change(i)
    mutex.release()           # 释放锁 
    

mutex = Lock()          # 新建一把互斥锁
for i in range(1,10):
    p = Process(target=run,args=(i,mutex))
    p.start()