当前位置: 首页 > news >正文

python高级03——多任务编程

1、多任务介绍

之前写的程序都是单任务的,即一个函数执行完再去执行另一个,想要多个函数同时执行就要用到多任务,可利用CPU资源,从而提高程序执行效率。

概念

在同一时间内执行多个任务。

例如现在的操作系统就是多任务操作系统,同时运行多个软件。

两种表现形式

1、并发

在一段时间内交替执行多个任务。

如在单核CPU中执行多个程序,表面上看不同程序是在同时进行,实质上是操作系统让每个任务交替执行。

2、并行

一段时间内真正同时一起执行多个任务。任务数量小于等于CPU核心数。

如多核CPU。

2、多进程介绍

在python中实现多任务要用进程完成。

1、进程的概念

process是资源分配的最小单位,是操作系统进行资源分配和调度运行的基本单位,通俗理解,一个正在运行的程序就是一个进程,没有运行时只是一个软件。

2、多进程的作用

3、多进程完成多任务

进程的创建步骤

1、导入进程包

import multiprocessing

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

进程对象=multiprocessing.Process()

3、启动进程执行任务

进程对象.start()

例子

没有创建子进程:

import timedef coding():for i in range(3):print("coding...")time.sleep(0.2)     def music():for i in range(3):print("music...")time.sleep(0.2)if __name__=='__main__':coding()music()

创建子进程:

import time
import multiprocessingdef coding():for i in range(3):print("coding...")time.sleep(0.2)def music():for i in range(3):print("music...")time.sleep(0.2)if __name__=='__main__':#通过进程类创建进程对象coding_process=multiprocessing.Process(target=coding)music_process=multiprocessing.Process(target=music)#启动进程coding_process.start()music_process.start()

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

#args:以元组的形式给函数传参,传参要和参数的顺序保持一致
#kwargs:以字典的形式给函数传参,传参中的key要和参数名保持一致#一个参数
import time
import multiprocessingdef coding(num):for i in range(num):print("coding...")time.sleep(0.2)def music(num):for i in range(num):print("music...")time.sleep(0.2)if __name__=='__main__':#通过进程类创建进程对象coding_process=multiprocessing.Process(target=coding,args=(3,))music_process=multiprocessing.Process(target=music,kwargs={"num":3})#启动进程coding_process.start()music_process.start()
#两个参数
import time
import multiprocessingdef coding(num,name):for i in range(num):print("coding...")print(name)time.sleep(0.2)def music(num):for i in range(num):print("music...")time.sleep(0.2)if __name__=='__main__':#通过进程类创建进程对象coding_process=multiprocessing.Process(target=coding,args=(3,"子进程"))music_process=multiprocessing.Process(target=music,kwargs={"num":3})#启动进程coding_process.start()music_process.start()

5、获取进程编号

获取当前进程:getpid()方法

获取当前父进程:getppid()方法

需要import os,用os.getpid()和os.getppid()

import time
import multiprocessing
import osdef coding(num,name):print("coding=%d"% os.getpid()) #获取当前进程编号print("父进程=%d" % os.getppid())  # 获取父进程编号for i in range(num):print("coding...")print(name)time.sleep(0.2)def music(num):print("music=%d" % os.getpid())  #获取当前进程编号print("父进程=%d" % os.getppid())  # 获取父进程编号for i in range(num):print("music...")time.sleep(0.2)if __name__=='__main__':print("父进程=%d"% os.getpid()) #获取父进程编号coding_process=multiprocessing.Process(target=coding,args=(3,"子进程"))music_process=multiprocessing.Process(target=music,kwargs={"num":3})coding_process.start()music_process.start()

6、进程间不共享全局变量

import multiprocessing
import os#全局变量
my_list=[]#写入数据进程
def write_data():for i in range(3):my_list.append(i)print("add:%d"%i)print("write",my_list)#读取数据进程
def read_data():print("read",my_list)if __name__=='__main__':write_process=multiprocessing.Process(target=write_data)read_process=multiprocessing.Process(target=read_data)write_process.start()read_process.start()

7、主进程和子进程的结束顺序

主进程会等待所有子进程结束才会结束:

import multiprocessing
import os
import timedef work():for i in range(10):print("working...")time.sleep(0.2)if __name__=='__main__':work_process=multiprocessing.Process(target=work)work_process.start()time.sleep(1)print("主进程执行完了")

法一:可以设置守护主进程:用daemon

import multiprocessing
import os
import timedef work():for i in range(10):print("working...")time.sleep(0.2)if __name__=='__main__':work_process=multiprocessing.Process(target=work)work_process.daemon=True #设为守护主进程,如果主进程结束,子进程不再执行work_process.start()time.sleep(1)print("主进程执行完了")

法二:销毁子进程:用terminate

import multiprocessing
import os
import timedef work():for i in range(10):print("working...")time.sleep(0.2)if __name__=='__main__':work_process=multiprocessing.Process(target=work)work_process.start()time.sleep(1)work_process.terminate() #手动结束子进程print("主进程执行完了")

3、多线程介绍

python中实现多任务还可以用多线程,同样的需求可以使用多线程。

4、锁的介绍

5、进程和线程的对比

http://www.dtcms.com/a/469670.html

相关文章:

  • 树模型优劣大比拼xgboost/lightgbm/RF/catboost,股价预测怎么选模型
  • 哈尔滨快速建站公司推荐营销型网站建设实战》
  • 4.3-中间件之Kafka
  • 方寸之间见天地:新兴高端印章的当代破局与价值重构
  • 如何改善基于深度学习的场重构
  • Maven 进行项目构建settings.xml 配置教程
  • 磁力搜索网站怎么做的网站和app设计区别
  • 西安网站建设公司都有哪些网站设计开发文档模板下载
  • C++设计模式_结构型模式_桥接模式Bridge
  • 关于flutter插件的存储位置问题
  • 把“Mixed Content”吃干抹净——一次 https→http 踩坑实录
  • 中山大学联合项目 论文解读 | iManip:面向机器人操作的技能增量学习
  • Unity:Json笔记——Json文件格式、JsonUtlity序列化和反序列化
  • 第八章 惊喜15 小萍收获初会
  • RabbitMQ基础知识与Spring Boot 3.x集成案例
  • 租房网站建设多少钱网站域名怎么改
  • Redis CPU高负载案例分析
  • ARMv9 CCA机密计算架构演进技术解析:重塑云原生时代的数据安全基石
  • 湖州网站设计浙北数据最新发布的手机有哪些
  • AD加域账号权限设置
  • 解决idea报错:Error running TrustApexCrmApplication. Command line is too long
  • 网站开发淄博进口商品代理平台
  • systme V共享内存(version1)
  • 万网网站制作wordpress投稿管理系统
  • python(47) : 快速截图[Windows工具(2)]
  • VSCODE GDB调试
  • 江西企业网站定制wordpress网页效果
  • CCF-GESP 等级考试 2024年6月认证C++三级真题解析
  • 前端学习1(学习时间:30分钟简单)
  • vlan范围