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

【黑马程序员】Python多任务

文章目录

  • 多进程
    • 多进程使用流程
      • 导入包
      • Process进程类说明
    • 获取进程编号
      • 目的
      • 常用操作
    • 获取进程名
    • 进程注意点
      • 进程之间不共享全局变量
      • 主进程会等待子进程结束之后再结束
      • 设置守护主进程
  • 多线程
    • threading模块
    • 线程注意点
      • 线程之间执行是无序的
      • 主线程会等待所有的子线程执行结束在结束
      • 线程之间共享全局变量
      • 线程之间共享全局变量数据出现错误问题
    • 多线程共享全局变量问题
      • 线程等待
      • 互斥锁

多进程

多进程使用流程

导入包

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开始递增的整数
  • 代码示例
# *_*coding:utf-8 *_*
import multiprocessing
import timedef sing(msg):for i in range(5):print(f"{msg}")time.sleep(1)def dance(msg):for i in range(5):print(f'{msg}')time.sleep(1)if __name__ == '__main__':# 单进程:需要至少10s钟完成# sing("sing")# dance("dance")# 三个进程:1个主进程,2个子进程# 创建子进程方式# target为任务名,创建一个sing线程,通过元组方式传参sing_obj = multiprocessing.Process(target=sing, args=("sing sing sing",))# target为任务名,创建一个dance线程,通过字段方式传参dance_obj = multiprocessing.Process(target=dance, kwargs={"msg": "dance dance dance"})# 启动两个线程sing_obj.start()dance_obj.start()

获取进程编号

目的

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

常用操作

  • 获取当前进程编号:os.getpid()
  • 回去当前父进程编号:os.getppid
  • 代码示例
# *_*coding:utf-8 *_*
import multiprocessing
import osdef sing():# 获取当前进程编号print("sing当前进程编号: ", os.getpid())# 获取当前进程print("sing 当前进程: ", multiprocessing.current_process())# 获取当前父进程编号print("sing父进程编号: ", os.getppid())if __name__ == '__main__':# 获取主进程IDprint("main当前进程编号: ", os.getpid())obj = multiprocessing.Process(target=sing)obj.start()

获取进程名

  • 创建子进程时,使用name给子进程起名
  • 代码示例
# *_*coding:utf-8 *_*
import multiprocessingdef sing():# 获取当前进程名print("sing 当前进程: ", multiprocessing.current_process())if __name__ == '__main__':# 获取主进程IDobj = multiprocessing.Process(target=sing, name="test_dance")obj.start()

进程注意点

进程之间不共享全局变量

  • 进程是分配资源的最小单位,每个进程都会有自己的独立空间
  • 创建子进程会对主进程资源进行拷贝,也就是说子进程是主进程的一个副本,之所以进程之间不共享全局变量,是因为操作的不是一个进程里面的全局变量,只不过不同进程里面的全局变量名字相同而已
  • 代码示例
# *_*coding:utf-8 *_*
import multiprocessing
import time# 定义全局变量
g_num = 0def my_read():print("my_read:", g_num)def my_write():# 向全局变量中写数据global g_numg_num = 10print("my_write:", g_num)if __name__ == '__main__':# 创建子进程read_obj = multiprocessing.Process(target=my_read)write_obj = multiprocessing.Process(target=my_write)# 开启子进程write_obj.start()# 保证全局变量数据被写入time.sleep(1)read_obj.start()

主进程会等待子进程结束之后再结束

  • 代码示例
# *_*coding:utf-8 *_*
import multiprocessing
import timedef func():for i in range(5):time.sleep(0.3)print("func()")if __name__ == '__main__':obj = multiprocessing.Process(target=func)obj.start()print("main")exit(0)

设置守护主进程

  • 设置守护主进程的目的是,主进程退出子进程销毁,不让主进程等待子进程去执行
  • 设置守护主进程方式:子进程对象.daemon=true
  • 销毁子进程方式:子进程对象.terminate()
  • 注意:需要在子进程start之前设置

多线程

  • 线程是使用资源的最小单位,依附于进程

threading模块

  • Python的多线程可以通过threading模块来实现
  • 语法
import threadingthread_obj = threading.Thread([group[, target[, name[, args[, kwargs]]]]])
group:预留参数,暂未使用
target:执行的目标任务名
args:以元组的方式给执行任务传参
kwargs:以字典的方式给执行任务传参
name:线程名,一般不设置# 启动线程
thread_obj.start()
  • 代码示例
# *_*coding:utf-8 *_*import time
import threadingdef sing(msg):while True:print(f"{msg}")time.sleep(1)def dance(msg):while True:print(f'{msg}')time.sleep(1)if __name__ == '__main__':# 创建一个sing线程,通过元组方式传参sing_thread_obj = threading.Thread(target=sing, args=("sing sing sing",))# 创建一个dance线程,通过字段方式传参dance_thread_obj = threading.Thread(target=dance, kwargs={"msg": "dance dance dance"})# 启动两个线程sing_thread_obj.start()dance_thread_obj.start()

线程注意点

线程之间执行是无序的

  • 代码示例
# *_*coding:utf-8 *_*
import threading
import timedef func():# sleep的时候CPU是空闲的,所有创建出来的线程都在等待CPU的执行time.sleep(0.3)# 实际执行线程位置print(threading.current_thread())if __name__ == '__main__':for _ in range(5):# 创建线程位置my_func = threading.Thread(target=func)my_func.start()

主线程会等待所有的子线程执行结束在结束

  • 未设置守护线程代码示例
# *_*coding:utf-8 *_*
import threading
import timedef func():for _ in range(5):time.sleep(0.2)print("func")if __name__ == '__main__':obj = threading.Thread(target=func)obj.start()time.sleep(0.5)print("main over")
  • 设置守护线程
    • 守护线程就是主线程退出子线程销毁不再执行
  • 设置方式
    • 方式一:threading.Thread(target=方法名, daemon=True)
    • 方式二:线程对象.setDaemon(True)
  • 代码示例
# *_*coding:utf-8 *_*
import threading
import timedef func():for _ in range(5):time.sleep(0.2)print("func")if __name__ == '__main__':# # 不设置守护线程方式# obj = threading.Thread(target=func)# # 设置守护线程方式一# obj = threading.Thread(target=func, daemon=True)obj = threading.Thread(target=func)# 设置守护线程方式二obj.setDaemon(True)obj.start()time.sleep(0.5)print("main over")

线程之间共享全局变量

# *_*coding:utf-8 *_*
import threading
import timeg_num = []def my_read():global g_numprint("my_read: ", g_num)def my_write():global g_numfor i in range(5):g_num.append(i)print("my_write: ", g_num)if __name__ == '__main__':print("main start: ", g_num)write_obj = threading.Thread(target=my_write)read_obj = threading.Thread(target=my_read)write_obj.start()# 确保write先执行time.sleep(0.1)read_obj.start()print("main finish: ", g_num)

线程之间共享全局变量数据出现错误问题

  • 代码示例
# *_*coding:utf-8 *_*
import threadingg_num = 0def func1():global g_numfor _ in range(1000000):g_num += 1print("func1: ", g_num)def func2():global g_numfor _ in range(1000000):g_num += 1print("func2: ", g_num)if __name__ == '__main__':obj1 = threading.Thread(target=func1)obj2 = threading.Thread(target=func2)obj1.start()obj2.start()print(g_num)

多线程共享全局变量问题

线程等待

  • 语法:子线程.join()
  • 功能:让主线程等待当前子线程执行完毕在继续向下执行
  • 代码示例
# *_*coding:utf-8 *_*
import threadingg_num = 0def func1():global g_numfor _ in range(1000000):g_num += 1print("func1: ", g_num)def func2():global g_numfor _ in range(1000000):g_num += 1print("func2: ", g_num)if __name__ == '__main__':obj1 = threading.Thread(target=func1)obj2 = threading.Thread(target=func2)obj1.start()obj1.join()obj2.start()obj2.join()print(g_num)

互斥锁

  • 对共享数据进行锁定,保证同一时刻只能有一个线程去操作
  • 基本使用语法
# 创建锁
mutex = threading.Lock()
# 上锁
mutex.acquire()
# 释放锁
mutex.release()
  • 代码示例
# *_*coding:utf-8 *_*
import threadingg_num = 0# 创建锁
mutex = threading.Lock()def func1():global g_num# 加锁mutex.acquire()for _ in range(1000000):g_num += 1# 释放锁mutex.release()print("func1: ", g_num)def func2():global g_num# 加锁mutex.acquire()for _ in range(1000000):g_num += 1# 释放锁mutex.release()print("func2: ", g_num)if __name__ == '__main__':obj1 = threading.Thread(target=func1)obj2 = threading.Thread(target=func2)obj1.start()obj2.start()

相关文章:

【黑马程序员】Python多任务

文章目录 多进程多进程使用流程导入包Process进程类说明 获取进程编号目的常用操作 获取进程名进程注意点进程之间不共享全局变量主进程会等待子进程结束之后再结束设置守护主进程 多线程threading模块线程注意点线程之间执行是无序的主线程会等待所有的子线程执行结束在结束线…...

前端与后端具备能力的区别

前端与后端具备能力的区别 在软件开发领域,前端和后端是两个至关重要的部分,它们各自承担着不同的职责和任务。前端主要负责与用户交互的界面设计和实现,而后端则负责处理数据和业务逻辑。因此,前端和后端开发者需要具备不同的技…...

【蓝桥杯】第15届蓝桥杯青少组stema选拔赛C++中高级真题答案(20240310)

一、选择题 第 1 题 第 2 题 表达式1000/3的结果是( A )。 A.333 B.333.3 C.334 D.333.0 第 3 题 下列选项中,判断a等于1并且b等于1正确的表达式是( B )。 A.!((a!1)&&(b!1)) B.!((a!1)||(b!1)) C.!(a1)&&(b1) D.(a1)&&(b1) 【解析】 A…...

20240319金融读报:金融助力农业科创企业风控模型

1、农发行2023年第二十期金融债券票面利率为2.85% 2、农业生产现代化转型-》农机:新疆尉犁县超级棉田里,农业无人机、采棉打包机、棉田打顶机器人等现代化机械设施,让两个人收种3000亩棉田成为了可能(金融机构可以结合农机购置补贴…...

React.js快速入门教程

React.js 是一个流行的 JavaScript 库,用于构建用户界面。以下是一个简单的 React.js 快速入门教程: 步骤 1:安装 Node.js 和 npm 首先,确保你的计算机上安装了 Node.js 和 npm(Node 包管理器)。你可以从…...

Jenkins构建时报错:Build step ‘Execute shell‘ marked build as failure

1.磁盘空间不足导致报错。 2.默认情况下,Jenkins采取 /bin/sh -xe 这种方式 -x 将打印每一个命令;另一个选项 -e,当任何命令以非零值(当任何命令失败时)退出代码时,这会导致shell立即停止运行脚本。 解决…...

C语言复杂度(个人笔记)

时间复杂度主要衡量一个算法的运行快慢. 空间复杂度主要衡量一个算法运行所需要的额外空间. 时间复杂度 算法中的基本操作的执行次数,为算法的时间复杂度. 只需要大概执行次数,我们使用大O的渐进表示法。(看谁对数学表达式的影响最大) 空间复杂度 是…...

与AI机器共存的三个层次

概述 当前我们无法不与AI机器共存。 或者说,在不远的近日,不能与AI机器和谐共处的人,就有可能会被淘汰。 新的生产革命,或许已经到来,只是我们身在此山中,当局者迷而已。 三个层次 API(Application Pr…...

python网络爬虫实战教学——requests的使用(1)

文章目录 专栏导读1、前言2、get请求3、抓取网页4、抓取二进制数据5、请求头 专栏导读 ✍ 作者简介:i阿极,CSDN 数据分析领域优质创作者,专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》,本专栏针对…...

腾讯云COS - 前端上传文件到 COS 跨域问题

问题描述 原因分析 因为我本地的地址是:http://localhost:9528 而发送请求时的地址是:http://132-1307119153.cos.ap-beijing.myqcloud.com/tu.jpg 域名不同,自然而然就出现了跨域的问题! 解决方案 先点击对象存储 - 安全设置…...

【笔记】Python学习记录

Python学习记录 Hello World变量简单数据类型字符串大小写转换插入变量Tab和Enter删除前后空格删除前后缀 Hello World 老调调了,如何在终端输出信息呢? print("Hello World")Hello World变量 变量命名遵从代码变量命名通则,几乎…...

力扣每日一题 2024/3/21 频率跟踪器

题目描述 用例说明 思路讲解 看到统计数字频率或者出现次数很容易想到用哈希表,但是一个哈希表count将数字和数字出现次数映射起来似乎不太够,如果需要统计数字出现次数的频率的话还是需要进行一次遍历,时间复杂度为O(n),有没有常…...

基于SpringBoot 实现指标监控及日志管理

添加Actuator功能 Spring Boot Actuator可以帮助程序员监控和管理SpringBoot应用,比如健康检查、内存使用情况统计、线程使用情况统计等。我们在SpringBoot项目中添加Actuator功能,即可使用Actuator监控 项目,用法如下: 在被监…...

Linux之看门狗

1、什么是看门狗? 在Linux系统中,看门狗机制主要包括硬件看门狗、软件看门狗和看门狗守护进程三个部分。硬件看门狗是一个独立的计时器设备,用于监视系统的运行状态。如果系统长时间没有发送喂狗信号,硬件看门狗将执行预设的动作…...

第十九章 TypeScript 装饰器Decorator

Decorator 装饰器是一项实验性特性,在未来的版本中可能会发生改变 它们不仅增加了代码的可读性,清晰地表达了意图,而且提供一种方便的手段,增加或修改类的功能 若要启用实验性的装饰器特性,你必须在命令行或tsconfig…...

第十四章 TypeScript tsconfig.json配置文件

生成tsconfig.json 文件 这个文件是通过tsc --init命令生成的 配置详解 "compilerOptions": {"incremental": true, // TS编译器在第一次编译之后会生成一个存储编译信息的文件,第二次编译会在第一次的基础上进行增量编译,可以提…...

科技助力高质量发展:新质生产力的崛起与企业数字化转型

引言 随着科技的飞速发展,我们正逐渐步入数字化智能时代,这个时代不仅为企业带来了无限的机遇,也让其面对前所未有的挑战。在这个快速变革的时代,企业必须不断调整自己的经营策略,适应数字化转型的浪潮,以…...

Redis - 缓存访问 缓存穿透 缓存击穿 缓存雪崩

一、缓存访问 1、客户端发送请求 2、服务首先会请求 redis,查看请求的内容是否存在 3、redis 将请求结果返回给服务,如果返回的结果有数据则直接返回给客户端;如果没有数据则会继续往下执行 4、服务从数据库中查询请求的数据 5、数据库将…...

SAP Business Application Studio(BAS)中开发Fiori App的基础知识

1. SAP Fiori Tools SAP Fiori Tools是一套用于支持SAP Fiori应用开发的工具,包括应用模板、可视化编辑器、代码生成、应用预览和集成测试工具等。这些工具可以帮助开发者更快速、更简单地创建和维护SAP Fiori应用。SAP Fiori Tools 可与SAP的开发环境(…...

DashScope - 阿里模型服务灵积

文章目录 关于 DashScope快速上手代码调用http 请求示例Python 调用 关于 DashScope 官方主页:https://dashscope.aliyun.comPYPI : https://pypi.org/project/dashscope/支持模型:https://dashscope.console.aliyun.com/model DashScope灵积模型服务建…...

64_《智能体微服务架构企业级实战教程》授权与认证之授权认证集成测试

前言 配套视频教程: 在 Bilibili课堂、CSDN课程、51CTO学堂 同步发售,提供:源码+部署脚本+文档。 bilibili课堂视频教程:智能体微服务架构企业级实战教程_哔哩哔哩_bilibili CSDN课程视频教程:智能体微服务架构企业级实战教程_在线视频教程-CSDN程序员研修院 51CTO学堂…...

DeepSeek系统设计辅助效能断崖式下降的3个信号,第2个90%工程师至今未察觉!

更多请点击: https://kaifayun.com 第一章:DeepSeek系统设计辅助效能断崖式下降的3个信号,第2个90%工程师至今未察觉! 当 DeepSeek 的系统设计辅助能力突然变“笨”——接口建议频繁失准、上下文感知错乱、生成代码无法通过基础编…...

亚马逊卖家公开信息数据提取:反爬攻防战与 Python 批量采集实战

摘要: 批量获取亚马逊(Amazon)第三方卖家的商业名称、信用代码和注册地址等信息,对于跨境 B2B 拓客和供应链分析具有重要意义。然而,亚马逊的 Cloudflare 盾和 Robot 验证码构成了极高的反爬门槛。本文将深度解析亚马逊…...

AI时代程序员职业发展与个人创业可行性研究报告

一、行业宏观变革(2026核心趋势数据佐证) 1.1 开发范式已彻底重构(行业不可逆拐点) 2026年正式进入AI Agent智能体开发时代,传统CRUD编码价值持续崩塌。 核心权威数据: Gartner预测:2026年75%企…...

举一个具体例子说明为什么索引不是越多越好,举具体字段

文章目录1. 核心舞台:笔记表 (t_note) 结构设计🚨 错误的操作:2. 结合具体字段,拆解三大翻车现场现场一:给 view_count(浏览量)加索引 —— 导致写放大,拖垮数据库现场二&#xff1a…...

Arcmap实操:如何用‘渔网’给你的地图做一次‘CT扫描’——以韶关市路网密度可视化为例

Arcmap实操:如何用‘渔网’给你的地图做一次‘CT扫描’——以韶关市路网密度可视化为例 想象一下,医生通过CT扫描将人体内部结构分层呈现,而GIS中的"渔网"工具同样能对城市路网进行"切片式"分析。这种空间离散化技术&…...

Graphin高级应用:结合GISDK构建配置化图分析模块的完整指南

Graphin高级应用:结合GISDK构建配置化图分析模块的完整指南 【免费下载链接】Graphin 🌌 A React toolkit for graph visualization based on G6. 项目地址: https://gitcode.com/gh_mirrors/gr/Graphin 在当今数据驱动的时代,图可视化…...

【python】ImportError: DLL load failed while importing QtWidgets: 找不到指定的程序。重新安装后搞定

文章目录前言一、PyQt6引用后报错二、使用步骤总结前言 想做个好看的界面,引用了PyQt6,却产生了新问题。 pip install pyqt6-tools,优先做这个动作进行修复。 一、PyQt6引用后报错 python里引用: from PyQt6.QtWidgets import…...

三步让小爱音箱秒变AI语音助手:MiGPT深度配置指南

三步让小爱音箱秒变AI语音助手:MiGPT深度配置指南 【免费下载链接】mi-gpt 🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 还在为小爱音箱的"人工智障&q…...

基于Arduino与蓝牙模块的六路无线开关控制系统设计与实现

1. 项目概述:用手机蓝牙控制六路LED想不想把手机变成一个无线遥控器,随手一点就能开关家里的灯带、氛围灯,甚至是其他电器?这个项目就是为你准备的。它基于一块功能增强的Arduino兼容板——GlowDuino Uno,配合一个极其…...