python中的多进程的实现

在python中有两种方法可以建立多进程

1. 用fork方法,方法如下:

import os
基于fork的进程创建 pid = os.fork()
功能:创建新的进程 返回值:整数,如果创建进程失败返回一个负数 如果成功,新进程得到0,原进程得到新进程的PID号 总结:*子进程会复制父进程的全部内存空间,从fork的下一句开始执行。 * 父子进程各自运行不影响,顺序不确定 * 利用父子进程中fork返回值的差异,配合if语句让父子进程执行不同内容几乎是固定搭配 * 父进程fork之前开辟的空间,子进程也会拥有,父子进程在各自空间操作不会互相影响 * 父子进程有各自特有的内容,PID,PCB。
进程相关函数

1.os.getpid() 功能:获取一个进程的PID值 返回值:返回当前进程的PID
2.os.getppid() 功能:或许一个父进程的PID值 返回值:返回父进程的PID
3.os._exit(status) 功能:结束一个进程 参数:进程结束状态 整数
4.sys.exit([status]) 功能:结束一个进程 参数:默认为0,整数表示退出状态,字符串表示退出是打印的内容

示例代码:

import os 
from time import sleep

pid = os.fork()

if pid < 0:
    print("Create process failed")
elif pid == 0:
    sleep(2)
    print("the new process")
else:
    sleep(3)
    print("The old process")
print("Fork test over")

使用fork比较麻烦的点在于:处理僵尸进程和孤儿进程比较麻烦,而且在创建子进程的时候需要在主函数中写分支结构(条件),用来区分子进程和主进程的执行部分

2.multiprocessing 模块使用

  1. 创建流程
    *将需要子进程处理的事件封装为函数
    *通过process类创建进程对象,关联函数
    *可以通过进程的对象对进程进行属性设置
    *通过start启动进程
    *通过join回收进程

    2.接口使用
    【1】Process()
    功能:创建进程对象
    参数:target绑定要执行的目标函数
    args 元祖给target函数位置传参
    kwargs 字典 给target函数关键字传参
    【2】p.start()
    功能:启动进程
    *此时进程产生,将p绑定函数作为新进程的执行内容。
    【3】p.join(【timeout】)
    功能:阻塞等待回收进程
    参数:超时时间
    * multiprocessing创建进程同样是复制父进程的空间代码,父子进程运行互不影响。
    * 子进程值执行target绑定函数,其余均由父进程执行
    * Process创建进程中,往往父进程只是用来创建和回收进程,具体事件由子进程完成。
    * multiprocessing创建的子进程中不能使用标准输入

    3.进程对象属性
    p.name 进程名称
    p.pid 进程pid号
    p.is_alive() 进程是否在生命周期。
    p.daemon 设置父子进程的退出关系
    * 将该属性设置为True则父进程退出,其子进程也会退出
    * 要求必须在start()前设置
    * 不会和join一起使用
    举例:

from multiprocessing import Process
from time import sleep
import os

def th1():
    sleep(3)
    print("EAT")
    print(os.getppid(),"---",os.getpid())

def th2():
    sleep(2)
    print("sleep")
    print(os.getppid(),"---",os.getpid())

def th3():
    sleep(4)
    print("study python")
    print(os.getppid(),"---",os.getpid())

things=[th1,th2,th3]
process = []
for th in things:
    p = Process(target = th)
    process.append(p)    #使用列表保存进程对象
    p.start()

for _ in process:
    _.join()

4.自定义进程类

编写流程: 【1】定义进程类继承Process 【2】编写自己的__init__函数添加属性,super重新加载父类__init__方法 【3】重写Process中run方法 使用: 【1】使用自定义类实例化对象 【2】通过对象调用start()创建进程,自动运行run 【3】通过join回收进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值