Python 多任务编程

多任务的介绍

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

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

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

多任务的概念

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

多任务的执行方式

并发:在一段时间内交替执行任务

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

进程

进程的介绍

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

进程的概念

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

多进程的使用

导入进程包

import multiprocessing

Process进程类的说明

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

  • group:指定进程组,目前只能使用None
  • target:执行的目标任务名
  • name:进程名字
  • args:以元组方式给执行任务传参
  • kwargs:以字典方式给执行任务传参

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

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

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

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

多进程完成多任务的代码

# 1. 导入进程包
import multiprocessing
import time


# 跳舞任务
def dance():
    for i in range(3):
        print('跳舞中...')
        time.sleep(0.2)


# 唱歌任务
def sing():
    for i in range(3):
        print('唱歌中...')
        time.sleep(0.2)


# 2. 创建子进程(自己手动创建的进程称为子进程,在__init__.py文件中已经导入的Process类)
    # 2.1 group:进程组,目前只能使用None,一般不需要设置
    # 2.2 target:进程执行目标任务
    # 2.3 name:进程名,如果不设置,默认是Process-1,......
if __name__ == '__main__':
    dance_process = multiprocessing.Process(target=dance)
    sing_process = multiprocessing.Process(target=sing)

# 3. 启动进程执行对应的任务
    dance_process.start()
    sing_process.start()

# 主进程执行唱歌任务
#     sing()

获取进程编号

获取进程编号的目的

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

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

  • 获取当前进程编号
  • 获取当前父进程编号

获取当前进程编号

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

# 获取当前进程(主进程)编号
main_process_id = os.getpid()
# 获取当前进程对象,查看当前代码是由哪个进程执行的
print('main_process_id:', main_process_id, multiprocessing.current_process())
# 跳舞任务
def dance():
    # 获取当前进程(子进程)编号
    dance_process_id = os.getpid()
    # 获取当前进程对象,查看当前代码是由哪个进程执行的
    print('dance_process_id:', dance_process_id, multiprocessing.current_process())

    for i in range(3):
        print('跳舞中...')
        time.sleep(0.2)


# 唱歌任务
def sing():
    # 获取当前进程(子进程)编号
    sing_process_id = os.getpid()
    # 获取当前进程对象,查看当前代码是由哪个进程执行的
    print('sing_process_id:', sing_process_id, multiprocessing.current_process())

    for i in range(3):
        print('唱歌中...')
        time.sleep(0.2)

获取当前父进程编号

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

# 跳舞任务
def dance():
    # 获取当前进程(子进程)编号
    dance_process_id = os.getpid()
    # 获取当前进程对象,查看当前代码是由哪个进程执行的
    print('dance_process_id:', dance_process_id, multiprocessing.current_process())
    # 获取当前进程的父进程编号
    dance_process_parent_id = os.getppid()
    print('dance_process的父进程编号是:', dance_process_parent_id)

    for i in range(3):
        print('跳舞中...')
        time.sleep(0.2)


# 唱歌任务
def sing():
    # 获取当前进程(子进程)编号
    sing_process_id = os.getpid()
    # 获取当前进程对象,查看当前代码是由哪个进程执行的
    print('sing_process_id:', sing_process_id, multiprocessing.current_process())
    # 获取当前进程的父进程编号
    sing_process_parent_id = os.getppid()
    print('sing_process的父进程编号是:', sing_process_parent_id)

    for i in range(3):
        print('唱歌中...')
        time.sleep(0.2)

扩展:根据进程编号强制杀死指定进程

# 跳舞任务
def dance():
    # 获取当前进程(子进程)编号
    dance_process_id = os.getpid()
    # 获取当前进程对象,查看当前代码是由哪个进程执行的
    print('dance_process_id:', dance_process_id, multiprocessing.current_process())
    # 获取当前进程的父进程编号
    dance_process_parent_id = os.getppid()
    print('dance_process的父进程编号是:', dance_process_parent_id)

    for i in range(3):
        print('跳舞中...')
        time.sleep(0.2)
        # 扩展:根据进程编号强制杀死指定进程
        os.kill(dance_process_id, 9)

相关文章

Python实现多进程的四种方式

方式一: os.fork()# -*- coding:utf-8 -*- """ pid=os.fork() 1.只用在Unix系统中有效,Windows系统中无效 2...

python多任务编程

Process进程类的说明Process([group [, target [, name [, args [, kwargs]]]]])group:指定进程组,目前只能使用Nonetarget:执行...

【Python程序开发系列】一文教你使用协程处理多任务(案例源码)

这是Python程序开发系列原创文章,我的第188篇原创文章。一、协程相关背景知识前文回顾:Python语言高级实战-基于协程的方式来实现异步并发编程(附源码和实现效果)【Python程序开发系列】进...

python多进程的分布式任务调度应用场景及示例

多进程的分布式任务调度可以应用于以下场景:分布式爬虫:import multiprocessing import requests def crawl(url): response = re...

Python中的多进程详解,让你的程序更快更强!

Python是一门高级编程语言,拥有简单易用、面向对象、可扩展等优点,因此被广泛应用于各种领域。但是在Python中,由于GIL(全局解释器锁)的存在,导致了多线程的效率不高。因此,在某些情况下,我们...