Python多进程

并发和并行的区别

并发指的是,假如单核的cpu,要同时运行多个任务,这个时候就需要不断的切换任务,只是切换的比较快,没有分辨出来。

并行,是假如是2核的cpu,有两个任务要运行,一个cpu执行一个任务,这个时候两个任务同时运行,就是并行。

可以使用多进程和多线程,完成多任务

一、多进程完成多任务

进程的创建步骤

1、导入进程包

import multiprocessing

2、通过进程类创建进程对象

进程对象 = multiprocessing.Processing(target=任务名)

参数名 说明

target 执行的目标任务名,这里指的是函数名(方法名)

name 进程名,一般不用设置

group 进程组,目前只能使用None

3、启动进程执行任务

进程对象.start()

单进程写法

import time
import multiprocessing

def sing():
    for i in range(3):
        print("唱歌....")
        time.sleep(0.5)


def dance():
    for i in range(3):
        print("跳舞.....")
        time.sleep(0.5)


if __name__ == '__main__':
    sing()
    dance()

多进程写法

import time
import multiprocessing


def sing():
    for i in range(3):
        print("唱歌....")
        time.sleep(0.5)


def dance():
    for i in range(3):
        print("跳舞.....")
        time.sleep(0.5)


if __name__ == '__main__':
    sing_process = multiprocessing.Process(target=sing)
    dance_process = multiprocessing.Process(target=dance)

    sing_process.start()
    dance_process.start()

二、进程执行带有参数的任务

参数名       说明

args           以元组的方式给执行的任务传参

kwargs       以字典的方式给执行任务传参

1、args 参数的使用

sing_process = multiprocessing.Process(target=sing, args=(3,))

sing_process.start()

元组的顺序,要与参数顺序一致

2、kwargs参数的使用

dance_process = multiprocessing.Process(target=dance, kwargs={"num": 3})

dance_process.start()

字典的key 要与参数一致

import time
import multiprocessing


def sing(num):
    for i in range(num):
        print("唱歌....")
        time.sleep(0.5)


def dance(num):
    for i in range(num):
        print("跳舞.....")
        time.sleep(0.5)


if __name__ == '__main__':
    sing_process = multiprocessing.Process(target=sing, args=(3,))
    dance_process = multiprocessing.Process(target=dance, kwargs={"num": 4})

    sing_process.start()
    dance_process.start()

三、获取进程的编号

1、获取当前进程编号

os.getpid()

import os

pid = os.getpid()
print(pid)

2、获取当前父进程编号

os.getppid()

import os

ppid = os.getppid()
print(ppid)

四、多进程的注意点

1、主进程默认会等待所有的子进程执行结束再结束,保证子进程都结束掉

import time
import multiprocessing


def work():
    for i in range(10):
        print("工作中")
        time.sleep(0.2)


if __name__ == '__main__':
    work_process = multiprocessing.Process(target=work)
    work_process.start()

    # 主进程失眠1秒
    time.sleep(1)
    print("主进程执行完成......")



# 工作中
# 工作中
# 工作中
# 主进程执行完成......
# 工作中
# 工作中
# 工作中
# 工作中
# 工作中
# 工作中
# 工作中

2、子进程设置守护主进程,一旦主进程结束,所有的子进程自动销毁

增加一行代码

work_process.daemon = True

import time
import multiprocessing


def work():
    for i in range(10):
        print("工作中")
        time.sleep(0.2)


if __name__ == '__main__':
    work_process = multiprocessing.Process(target=work)
    work_process.daemon = True
    work_process.start()

    # 主进程失眠1秒
    time.sleep(1)
    print("主进程执行完成......")


# 工作中
# 工作中
# 工作中
# 工作中
# 工作中
# 主进程执行完成......

总结:

为了保证子进程能够正常的运行,主进程会等所有的子进程执行完成以后再销毁,设置守护主进程的目的是主进程退出子进程销毁,不让主进程再等待子进程去执行。

设置守护主进程方式:子进程对象.daemon = True

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NeilNiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值