第二十一天Python之进程

多任务

电脑中的多任务
在这里插入图片描述
思考:为什么在下载的时候要多个任务同时下载

多任务的优势
多任务的最大好处是充分 利用CPU资源,提高程序的执行效率

1. 多任务的概念
多任务是指在 同一时间 内执行 多个任务

在这里插入图片描述
2. 多任务的两种表现形式

  • 并发
  • 并行

3. 并发
在一段时间内 交替 去执行多个任务

例子:
对于单核cpu处理多任务,操作系统轮流让各个 任务交替执行
在这里插入图片描述
4. 并行
在一段时间内 真正的同时一起 执行多个任务

例子:
对于多核cpu处理多任务,操作系统会给cpu的每个内核安排一个执行的任务,多个内核是真正的 一起同时执行多个任务。 这里需要注意多核cpu是并行的执行多任务,始终有多个任务一起执行。

在这里插入图片描述

进程的介绍

1. 程序中实现多任务的方式
在 Python 中,想要实现多任务可以使用 多进程 来完成

2. 进程的概念
进程(Process)是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位,通俗理解:一个正在运行的程序就是一个进程,例如:正在运行的qq,微信等,他们都是一个进程
在这里插入图片描述
注意:

一个程序运行后至少有一个进程

3. 多进程的作用
在这里插入图片描述
思考
图中是一个非常简单的程序,一旦运行hello.py这个程序,按照代码的执行顺序,func_a函数执行完毕后才能执行func_b函数,如果可以让func_a和func_b同时运行,显然执行hello.py这个程序的效率会大大提升

4. 多进程的作用

在这里插入图片描述

多进程完成多任务

1. 进程的创建步骤

  • 导入进程包
import multiprocessing
  • 通过进程类创建进程对象
进程对象 = multiprocessing.Process()
  • 启动进程执行任务
进程对象.start()

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

进程对象 = multiprocessing.Process(target=任务名)
参数名说明
target执行的目标任务名,这里指的是函数名(方法名)
name进程名,一般不同设置
group进程组,目前只能使用None

3. 进程创建与启动的代码

# 创建子进程
sing_process = multiprocessing.Process(target=sing)
# 创建子进程 
dance_process = multiprocessing.Process(target=dance)
# 启动进程
sing_process.start()
dance_process.start()

多进程完成多任务

  • 导入进程包 import multiprocessing
  • 创建子进程并指定执行的任务 sub_process = multiprocessing.Process(target=任务名)

进程执行带有参数的任务

1. 进程执行带有参数的任务

参数名说明
args以元组的方式给执行任务传参
kwargs以字典方式给执行任务传参

2. args参数的使用

# target:进程执行的函数名
# args:表示以元组的方式给函数传参
sing_process = multiprocessing.Process(target=sing,args=(3,))
sing_process.start()

3. kwargs参数的使用

# target:进程执行的函数名
# kwargs:表示以字典的方式给函数传参
dance_process = multiprocessing.Process(target=dance, kwargs={"num":3})
# 启动进程
dance_process.start()

进程执行带有参数的任务

  • 元组方式传参: 元组方式传参一定要和参数的 顺序保持一致
  • 字典方式传参: 字典方式传参字典中的Key一定要和 参数名保持一致

获取进程编号

进程编号的作用
当程序中进程的数量越来越多时,如果没有办法区分朱金城和子进程还有不同的子进程,那么就无法进行有效的进程管理,为了方便管理实际上每个进程都是有自己编号的

获取进程编号的两种方式:

  1. 获取当前进程编号
    os.getpid()
  2. 获取当前父进程编号
    os.getppid()

1. os.getpid()的使用

import os
pid = os.getpid()
print(pid)

2. os.getppid()的使用

def work():
		# 获取当前进程的编号
		print("work进程编号", os.getpid())
		# 获取父进程的编号
		print(“work父进程的编号”, os.getppid())

获取进程编号

  • 获取当前进程编号:os.getpid()
  • 获取当前父进程编号:os.getppid()

进程的注意点

主进程会等待所有的子进程执行结束再结束

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. 设置守护主进程

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("主进程执行完了")

3. 知识要点

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

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

进程的注意点

  • 主进程会等待所有的子进程执行结束再结束,除非设置子进程守护主进程
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
os.getpid()是一个Python函数,用于获取当前进程PID进程ID)。\[3\]它返回一个整数值。 os.getppid()也是一个Python函数,用于获取当前进程的主进程的PPID(父进程ID)。\[3\]它返回一个整数值。 在多进程编程中,每个进程都有自己的PID和PPIDPID进程的唯一标识符,而PPID是创建该进程的父进程PID。\[1\] \[3\] #### 引用[.reference_title] - *1* [python os.fork() os.getpid() os.getppid()](https://blog.csdn.net/GG_Fu/article/details/107497878)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [对python中的os.getpid()和os.fork()函数详解](https://blog.csdn.net/weixin_34539480/article/details/115757134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [python模块os.getpidos.getppid在多进程中的应用](https://blog.csdn.net/LCY133/article/details/107151882)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值