[Python]多任务编程--进程(一)

简介: [Python]多任务编程--进程

6c5225018160411dbc11c5c49ae9715c.jpg

前言

系列文章目录

[Python]目录

视频及资料和课件

链接:https://pan.baidu.com/s/1LCv_qyWslwB-MYw56fjbDg?pwd=1234

提取码:1234

多任务的介绍

1 提问

利用现学知识能够让两个函数或者方法同时执行吗?

不能,因为之前所写的程序都是单任务的,也就是说一个函数或者方法执行完成另外一个函数或者方法才能执行,要想实现这种操作就需要使用多任务。

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

2 多任务的概念

多任务是指在同一时间内执行多个任务,例如: 现在电脑安装的操作系统都是多任务操作系统,可以同时运行着多个软件。

多任务效果图:

3 多任务的执行方式

  1. 并发
  2. 并行

3.1 并发

在一段时间内交替去执行任务

例如:

对于单核cpu处理多任务,操作系统轮流让各个软件交替执行,假如:软件1执行0.01秒,切换到软件2,软件2执行0.01秒,再切换到软件3,执行0.01秒……这样反复执行下去。表面上看,每个软件都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像这些软件都在同时执行一样,这里需要注意单核cpu是并发的执行多任务的

3.2 并行

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

并行才是多个任务真正意义一起执行。

对于多核CPU,如果执行的任务数小于CPU的核数,则并行执行;如果执行的任务数大于CPU的核数,则并发执行。

进程

1 进程的介绍

Python程序中,想要实现多任务可以使用进程来完成,进程是实现多任务的一种方式

2 进程的概念

一个正在运行的程序或者软件就是一个进程,进程是操作系统进行资源分配的基本单位,也就是说每启动一个进程,操作系统都会给其分配一定的运行资源(内存资源)保证进程的运行。

进程向操作系统索要内存资源,保证进程可以正常运行。真正在执行代码的是线程。

例如,将社会看成是操作系统,社会中的各种资源尤其管理,现实生活中的公司可以理解成是一个进程,公司通过向社会获取资源,从而能够向员工提供办公资源(电脑、办公桌椅等),然而在公司中真正干活的是员工,员工可以理解成线程。

注意:

一个程序运行后至少有一个进程,一个进程默认有一个线程,进程里面可以创建多个线程,线程是依附在进程里面的,没有进程就没有线程

3 进程的作用

单进程效果图:

多进程效果图:

说明:

多进程可以完成多任务,每个进程就好比一家独立的公司,每个公司都各自在运营,每个进程各自在运行,执行各自的任务。

多进程的使用

1 导入进程包

#导入进程包
import multiprocessing

2 Process进程类的说明

Process([group [, target [, name [, args [, kwargs]]]]])

  • group:指定进程组,目前只能使用None

  • target:执行的目标任务名(需要执行的函数或方法的函数名或方法名)
  • name:进程名字(一般不用设置,每个进程会有默认的进程名)
  • args:以元组方式给执行任务传参
  • kwargs:以字典方式给执行任务传参

Process创建的实例对象的常用方法

  • start():启动子进程
  • join():等待子进程执行结束
  • terminate():不管任务是否完成,立即终止子进程

Process创建的实例对象的常用属性

  • name:当前进程的别名,默认为Process-N,N为从1开始递增的整数

3 多进程完成多任务的代码

# 导入进程包
import multiprocessing
import time
# 唱歌任务
def sing():
    for i in range(5):
        print('唱歌中...')
        time.sleep(0.2)
# 跳舞任务
def dance():
    for i in range(5):
        print('跳舞中...')
        time.sleep(0.2)
# 判断当前运行的是否为主进程
if __name__ == '__main__':
    # 创建跳舞的子进程
    dance_process = multiprocessing.Process(group=None, target=dance, name='dance')
    # 启动跳舞的子进程
    dance_process.start()
    # 主进程执行唱歌的任务
    sing()

注意:

执行的目标任务后面不能带(),否则相当于调用函数执行。

进程的执行顺序是无序的,具体哪个进程先执行由操作系统调度决定。

获取进程编号

1 获取进程编号的目的

获取进程编号的目的是验证主进程和子进程的关系,可以得知子进程是由那个主进程创建出来的。

获取进程编号的两种操作:

(1)获取当前进程编号

(2)获取当前父进程编号

2 获取当前进程编号

os.getpid() 表示获取当前进程编号

# 获取当前进程对象
multiprocessing.current_process()

示例代码:

# 导入进程包
import multiprocessing
import time
# 导入获取进程编号相关的模块
import os
# 唱歌任务
def sing():
    # 获取当前进程的id
    sing_process_id = os.getpid()
    # 获取当前进程对象
    sing_process_object = multiprocessing.current_process()
    print(sing_process_object, sing_process_id)
    for i in range(5):
        print('唱歌中...')
        time.sleep(0.2)
# 跳舞任务
def dance():
    # 获取当前进程的id
    dance_process_id = os.getpid()
    # 获取当前进程对象
    dance_process_object = multiprocessing.current_process()
    print(dance_process_object, dance_process_id)
    for i in range(5):
        print('跳舞中...')
        time.sleep(0.2)
# 判断当前运行的是否为主进程
if __name__ == '__main__':
    # 获取当前进程的id
    main_process_id = os.getpid()
    # 获取当前进程对象
    main_process_object = multiprocessing.current_process()
    print(main_process_object, main_process_id)
    # 创建跳舞的子进程
    dance_process = multiprocessing.Process(group=None, target=dance, name='dance')
    # 启动跳舞的子进程
    dance_process.start()
    # 主进程执行唱歌的任务
    sing()

由于任务 sing 运行在主进程中,所以 sing 任务中获取的进程对象及进程编号与主进程相同。

主进程的进程名为 MainProcess

dance 任务的进程名为dance是由于创建进程时,由指定进程名。




相关文章
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
21天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
105 80
|
10天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
30 14
|
2天前
|
存储 安全 数据可视化
用Python实现简单的任务自动化
本文介绍如何使用Python实现任务自动化,提高效率和准确性。通过三个实用案例展示:1. 使用`smtplib`和`schedule`库自动发送邮件提醒;2. 利用`shutil`和`os`库自动备份文件;3. 借助`requests`库自动下载网页内容。每个案例包含详细代码和解释,并附带注意事项。掌握这些技能有助于个人和企业优化流程、节约成本。
25 3
|
29天前
|
数据采集 存储 监控
21个Python脚本自动执行日常任务(2)
21个Python脚本自动执行日常任务(2)
91 7
21个Python脚本自动执行日常任务(2)
|
21天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
89 13
|
20天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
57 2
|
1月前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
48 10
|
1月前
|
人工智能 数据挖掘 开发者
探索Python编程之美:从基础到进阶
本文是一篇深入浅出的Python编程指南,旨在帮助初学者理解Python编程的核心概念,并引导他们逐步掌握更高级的技术。文章不仅涵盖了Python的基础语法,还深入探讨了面向对象编程、函数式编程等高级主题。通过丰富的代码示例和实践项目,读者将能够巩固所学知识,提升编程技能。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考和启示。让我们一起踏上Python编程的美妙旅程吧!
|
6月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能