前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多任务编程 - 1

多任务编程 - 1

作者头像
用户9399690
发布2022-01-20 15:32:18
4280
发布2022-01-20 15:32:18
举报
文章被收录于专栏:码猴小明码猴小明
因为作者比起Java更喜欢Python,所以接下来会分享关于Python全栈的学习笔记等等。

多任务的介绍

1、多任务的执行

  • 并发
  • 并行

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

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

任务数大于cpu的核数表示并发的去执行多任务

任务数小于等于cpu核数表示并行的去执行多任务

2、小结

  • 使用多任务就能充分利用CPU资源,提高程序的执行效率,让你的程序具备处理多个任务的能力。
  • 多任务执行方式有两种方式:并发和并行,这里并行才是多个人任务真正意义一起执行。

进程

1、进程的介绍

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

2、进程的概念

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

比如:现实生活中的公司可以理解成是一个进程,公司提供办公资源(电脑、办公桌椅等),真正干活的是员工,员工可以理解为线程。

注意:

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

3、进程的作用

单进程效果图:

多进程效果图:

4、小结

  • 进程是操作系统进行资源分配的基本单位
  • 进程是Python程序中实现呐多任务的一种方式

多进程的使用

1、导入进程包

代码语言:javascript
复制
#导入进程包
import multiprocessing

2、Process进程类的说明

Proces([group[,targt[,name[,args[,kwargs]]]]])

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

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

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

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

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


获取进程编号

1、获取进程编号的目的

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

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

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

2、获取当前进程编号

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

代码演示:

代码语言:javascript
复制
import multiprocessing
import time
import os
# 跳舞任务
def dance():
    # 获取当前进程的编号
    print("dance", os.getpid())
    # 获取当前进程
    print("dance", multiprocessing.current_process())
    for i in range(5):
        print("跳舞中···")
        time.sleep(0.2)
        # 扩展:根据进程编号杀死指定进程
        os.kill(os.getpid(), 9)
# 唱歌任务
def sing():
    # 获取当前进程的编号
    print("sing", os.getpid())
    # 获取当前进程
    print("sing", multiprocessing.current_process())
    for i in range(5):
        print("唱歌中···")
        time.sleep(0.2)
if __name__ == '__main__':
    # 获取当前进程号
    print("main", os.getpid())
    # 获取当前进程
    print("main", multiprocessing.current_process())
    # 创建跳舞的子进程
    # group:表示进程组,目前只能使用None
    # target:表示执行的目标任务名(函数名,方法名)
    # name:进程名称,默认是Process -N N从1开始依次递增
    dance_process = multiprocessing.Process(target=dance, name="myprocess1")
    sing_process = multiprocessing.Process(target=sing)
    # 启动子进程执行对应的任务
    dance_process.start()
    sing_process.start()

3、获取当前父进程编号

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

代码演示:

代码语言:javascript
复制
# -*- codeing = utf-8 -*-
# @Time : 2021/12/4 10:51 下午
# @Author : 李明辉
# @File : ithui_多进程.py
# @Software : PyCharm
import multiprocessing
import time
import os
# 跳舞任务
def dance():
    # 获取当前进程的编号
    print("dance", os.getpid())
    # 获取当前进程
    print("dance", multiprocessing.current_process())
    # 获取当前进程对象,查看当前代码是由哪个进程执行的,multiprocessing.current_process()
    print('main_process_id', os.getpid(), multiprocessing.current_process())
    # 获取父进程的编号
    print("dance", os.getppid())
    for i in range(5):
        print("跳舞中···")
        time.sleep(0.2)
        # 扩展:根据进程编号杀死指定进程
        os.kill(os.getpid(), 9)
# 唱歌任务
def sing():
    # 获取当前进程的编号
    print("sing", os.getpid())
    # 获取当前进程
    print("sing", multiprocessing.current_process())
    print('main_process_id', os.getpid(), multiprocessing.current_process())
    # 获取父进程的编号
    print("sing", os.getppid())
    for i in range(5):
        print("唱歌中···")
        time.sleep(0.2)
if __name__ == '__main__':
    # 获取当前进程号
    print("main", os.getpid())
    # 获取当前进程
    print("main", multiprocessing.current_process())
    # 创建跳舞的子进程
    # group:表示进程组,目前只能使用None
    # target:表示执行的目标任务名(函数名,方法名)
    # name:进程名称,默认是Process -N N从1开始依次递增
    dance_process = multiprocessing.Process(target=dance, name="myprocess1")
    sing_process = multiprocessing.Process(target=sing)
    # 启动子进程执行对应的任务
    dance_process.start()
    sing_process.start()

进程执行带有参数的任务的介绍

1、进程执行带有参数的任务的介绍

Process类执行任务传参数有两种方式:

  • args表示以元组的方式给执行任务传参
  • kwargs表示以字典方式给执行任务传参

2、args参数的使用

代码演示:

代码语言:javascript
复制
# -*- codeing = utf-8 -*-
# @Time : 2021/12/4 11:27 下午
# @Author : 李明辉
# @File : ithui_进程带有参数的任务.py
# @Software : PyCharm
import multiprocessing
import time
# 显示信息的任务
def show_info(name, age):
    print(name, age)
# 创建子进程
# 1、以元组方式传参
sub_process = multiprocessing.Process(target=show_info, args=("李四", 20))
# 2、以字典方式传参
# sub_process = multiprocessing.Process(target=show_info, kwargs={"name":"李四", "age":20})
# 3、以元组和字典一起传参
# sub_process = multiprocessing.Process(target=show_info, args=("李四",), kwargs={"age":20})
# 启动进程
if __name__ == '__main__':
    sub_process.start()

3、kwargs参数的使用

代码演示:

代码语言:javascript
复制
# -*- codeing = utf-8 -*-
# @Time : 2021/12/4 11:27 下午
# @Author : 李明辉
# @File : ithui_进程带有参数的任务.py
# @Software : PyCharm
import multiprocessing
import time
# 显示信息的任务
def show_info(name, age):
    print(name, age)
# 创建子进程
# 1、以元组方式传参
# sub_process = multiprocessing.Process(target=show_info, args=("李四", 20))
# 2、以字典方式传参
sub_process = multiprocessing.Process(target=show_info, kwargs={"name":"李四", "age":20})
# 3、以元组和字典一起传参
# sub_process = multiprocessing.Process(target=show_info, args=("李四",), kwargs={"age":20})
# 启动进程
if __name__ == '__main__':
    sub_process.start()
4、args和kwargs一起使用
代码演示:
# -*- codeing = utf-8 -*-
# @Time : 2021/12/4 11:27 下午
# @Author : 李明辉
# @File : ithui_进程带有参数的任务.py
# @Software : PyCharm
import multiprocessing
import time
# 显示信息的任务
def show_info(name, age):
    print(name, age)
# 创建子进程
# 1、以元组方式传参
# sub_process = multiprocessing.Process(target=show_info, args=("李四", 20))
# 2、以字典方式传参
# sub_process = multiprocessing.Process(target=show_info, kwargs={"name":"李四", "age":20})
# 3、以元组和字典一起传参
sub_process = multiprocessing.Process(target=show_info, args=("李四",), kwargs={"age":20})
# 启动进程
if __name__ == '__main__':
    sub_process.start()

进程的注意点

1、进程的注意点介绍

  1. 进程之间不共享全局变量
  2. 主进程会等待所有子进程执行结束后再结束

2、进程之间不共享全局变量

代码演示:

代码语言:javascript
复制
# -*- codeing = utf-8 -*-
# @Time : 2021/12/6 10:09 下午
# @Author : 李明辉
# @File : ithui_进程之间不共享全局变量.py
# @Software : PyCharm
import multiprocessing
import time
# 定义全局变量
g_list = list()
# 添加数据的任务
def add_data():
    for i in range(3):
        g_list.append(i)
        print("add:", i)
        time.sleep(0.2)
    print("添加完成", g_list)
# 读取数据的任务
def read_data():
    print("read:", g_list)
# 添加数据的子进程
add_process = multiprocessing.Process(target=add_data)
# 读取数据的子进程
read_process = multiprocessing.Process(target=read_data)
if __name__ == '__main__':
    # 启动进程执行对应的任务
    add_process.start()
    # 当前进程(主进程)等待添加数据的进程执行完成以后代码再继续乡下执行
    add_process.join()
    read_process.start()

执行结果:

创建子进程只是对主进程资源进行拷贝,子进程其实就是主进程的副本。

3、主进程会等待所有子进程执行结束后再结束

代码演示:

代码语言:javascript
复制
# -*- codeing = utf-8 -*-
# @Time : 2021/12/6 10:57 下午
# @Author : 李明辉
# @File : ithui_主进程会等待所有子进程执行结束再结束.py
# @Software : PyCharm
import multiprocessing
import time
def task():
    for i in range(10):
        print("任务执行中...")
        time.sleep(0.2)
# 判断是否是直接执行的模块,程序入口模块
if __name__ == '__main__':
    # 创建子进程
    sub_process = multiprocessing.Process(target=task)
    # 把子进程设置成为守护主进程,以后主进程退出子进程直接销毁
    sub_process.daemon = True
    sub_process.start()
    # 主进程延时0.5秒钟
    time.sleep(0.5)
    print("over")

END

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码猴小明 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档