第二十八章 多任务编程(Python)

文章目录

  • 前言
  • 一、执行方式
    • 1、并发
    • 1、并发
  • 二、协程
  • 三、线程
  • 三、进程


前言

单任务,也就是说一个函数或者方法执行完成,另外一个函数或者方法才能执行;而多任务能够让两个以上函数或者方法同时执行。多任务编程充分利用CPU资源,提高程序的执行效率。

一、执行方式

1、并发

在一段时间内交替去执行任务;但是,由于CPU的执行速度实在是太快了,我们感觉就像这些软件都在执行同时一样;单核cpu是并发的执行多任务的。

1、并发

在多核cpu处理多任务,多个内核是真正的一起执行软件;多核cpu是并行的执行多任务,始终有多个一起执行。

二、协程

是python个中另外一种实现多任务的方式;只不过比线程占用更小执行单元;优势就是协程极高的执行效率。

import gevent


def f(n):
    for i in range(n):
        print(gevent.getcurrent(), i)


g1 = gevent.spawn(f, 5)
g2 = gevent.spawn(f, 5)
g3 = gevent.spawn(f, 5)
g1.join()
g2.join()
g3.join()

三、线程

是cpu调度的基本单位;每个进程至少都有一个线程,而这个线程就是我们通常说的主线程;线程实现多任务的另外一种方式。

import threading  # 导入线程包
import time

'''
线程类Thread
group: 线程组,目前只能使用None
target: 执行的目标任务名
args: 以元组的方式给执行任务参传
kwargs: 以字典方式给执行任务参传
name: 线程名,一般不用设置

启动线程
start方法
'''

sum = 0  # 线程之间共享全局变量;线程之间共享全局变量数据出现错误问题

lock = threading.Lock()  # 创建互斥锁;互斥锁: 对共享数据进行锁定,保证同一时刻只能有一个线程去操作。


def run(count):
    lock.acquire()  # 上锁
    global sum
    for _ in range(count):
        sum += 1
        print("跑")
        time.sleep(0.2)
        if sum > 2:
            lock.release()  # 死锁示例;在合适的地方释放锁
            return
    lock.release()  # 解锁
    print(sum)


def dance(count):
    lock.acquire()
    global sum
    for _ in range(count):
        sum += 1
        print("跳")
        time.sleep(0.2)
    lock.release()
    print(sum)


'''
线程之间执行是无序的,run和dance的执行没有顺序;它是由cpu调度决定的

主线程会等待所有的子线程执行结束再结束
设置守护主线程有两种方式:
    threading.Thread(target=show_info, daemon=True)
    线程对象.setDaemon(True)

'''
if __name__ == '__main__':
    r = threading.Thread(target=run, args=(4,))
    d = threading.Thread(target=dance, kwargs={"count": 4})
    r.start()
    # r.join()  # 线程等待(join);线程同步: 保证同一时刻只能有一个线程去操作全局变量
    d.start()

三、进程

一个正在运行的程序(软件)就是一个进程,是运营进程进行资源分配的基本单位;进程是实现多任务的一种方式。一个程序运行后至少有一个进程,一个进程默认有一个线程;进程里面可以创建多个线程。

import multiprocessing  # 导入进程包
import time
import os

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

Process创建的实例对象的常用方法:
start():启动子进程实例(创建子进程)
join():等待子进程执行结束
terminate():不管任务是否完成,立即终止子进程
'''
sum = 0  # 定义一个全局变量;进程之间不共享全局变量


def run(count):
    global sum
    print("run:", os.getpid())
    print("run:", multiprocessing.current_process())
    print("run:", os.getppid())  # 获取父进程的编号
    for i in range(count):
        print("跑")
        time.sleep(1)
        sum += 1
        # os.kill(os.getpid(), 9)
    print(sum)


def dance(count):
    global sum
    print("dance:", os.getpid())
    print("dance:", multiprocessing.current_process())
    print("dance:", os.getppid())  # 获取父进程的编号
    for i in range(count):
        print("跳")
        time.sleep(1)
        sum += 1
        # os.kill(os.getpid(), 9)  # 根据进程编号杀死指定进程,进程被杀死,之后的代码不在执行
    print(sum)


if __name__ == '__main__':
    print("main:", os.getpid())  # os.getpid()表示获取当前进程的编号
    print("main:", multiprocessing.current_process())  # 获取当前进程
    print("main:", os.getppid())  # 获取父进程的编号
    r = multiprocessing.Process(target=run, kwargs={"count": 4})  # 字典方式传参(kwargs): 字典方式传参字典中的key一定要和参数名保持一致。
    r.daemon = True  # 设置守护进程,主进程退出,子进程直接销毁
    d = multiprocessing.Process(target=dance, args=(3,))  # 元组方式传参(args): 元组方式传参一定要和参数的顺序保持一致。
    d.daemon = True
    r.start()
    d.start()
    time.sleep(2)  # 主进程会等待所有的子进程执行完成以后程序再退出
    print("over")
    # r.terminate()#销毁子进程来达到主进程退出,因为主进程会等待所有的子进程执行完成以后程序再退出
    # d.terminate()
    exit()
    
    
#************************************************#
"C:\Program Files\JetBrains\python\python.exe" "F:/PyCharm 2019.1.3/PycharmProject/1.py"
main: 5180
main: <_MainProcess(MainProcess, started)>
main: 11700
run: 2316
run: <Process(Process-1, started daemon)>
run: 5180
跑
dance: 11396
dance: <Process(Process-2, started daemon)>
dance: 5180
跳
跑
跳
over

Process finished with exit code 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/771062.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在 Selenium Python 中解决验证码 | 2024 完整指南

由于在进行网络自动化时遇到验证码是让许多人感到不知所措的问题。这些验证码专为区分人类用户和自动化脚本而设计&#xff0c;对于使用Selenium进行网络爬虫或自动化任务而言&#xff0c;无疑是一个巨大的挑战。2024年的完全指南将为您提供全面的解决方案&#xff0c;帮助您高…

LabVIEW新能源汽车电池性能测试系统

新能源汽车的核心部件之一是电池&#xff0c;其性能直接关系到整车的续航里程、安全性和寿命。为了确保电池的性能和可靠性&#xff0c;测试是必不可少的环节。本文介绍了一种基于LabVIEW的新能源汽车电池性能测试系统&#xff0c;通过LabVIEW与数据采集设备的无缝集成&#xf…

【Spring Boot 源码学习】初识 ConfigurableEnvironment

《Spring Boot 源码学习系列》 初识 ConfigurableEnvironment 一、引言二、主要内容2.1 Environment2.1.1 配置文件&#xff08;profiles&#xff09;2.1.2 属性&#xff08;properties&#xff09; 2.2 ConfigurablePropertyResolver2.2.1 属性类型转换配置2.2.2 占位符配置2.…

docker容器技术、k8s的原理和常见命令、用k8s部署应用步骤

容器技术 容器借鉴了集装箱的概念&#xff0c;集装箱解决了什么问题呢&#xff1f;无论形状各异的货物&#xff0c;都可以装入集装箱&#xff0c;集装箱与集装箱之间不会互相影响。由于集装箱是标准化的&#xff0c;就可以把集装箱整齐摆放起来&#xff0c;装在一艘大船把他们…

C++基础(五):类和对象(上)

从今天开始&#xff0c;我们正式进入面向对象编程&#xff0c;这是C与C语言的重要区别&#xff0c;编程思想发生变化&#xff0c;那到底什么是面向对象编程呢&#xff1f;接下来&#xff0c;我们慢慢的深入学习。 目录 一、面向过程和面向对象初步认识 1.1 面向过程 1.2 面…

【Python】变量与基本数据类型

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言变量声明变量变量的命名规则 变量赋值多个变量赋值 标准数据类型变量的使用方式存储和访问数据&#xff1a;参与逻辑运算和数学运算在函数间传递数据构建复杂的数据结构 NameE…

腾讯混元文生图开源模型推出小显存版本,6G显存即可运行,并开源caption模型

7月4日&#xff0c;腾讯混元文生图大模型&#xff08;混元DiT&#xff09;宣布开源小显存版本&#xff0c;仅需6G显存即可运行&#xff0c;对使用个人电脑本地部署的开发者十分友好&#xff0c;该版本与LoRA、ControlNet等插件&#xff0c;都已适配至Diffusers库&#xff1b;并…

达梦数据库 页大小与数据库字段长度的关系

对于达梦数据库实例而言&#xff0c;页大小 (page_size)、簇大小 (extent_size)、大小写敏感 (case_sensitive)、字符集 (charset) 这四个参数&#xff0c;一旦确定无法修改&#xff1b;如果过程中发现这些数据设置的不对&#xff0c;只能是重新新建数据库实例&#xff0c;而不…

脑启发设计:人工智能的进化之路

编者按&#xff1a;你可以用左手&#xff08;不常用的那只手&#xff09;的小指与食指拿起一件物品么&#xff1f; 试完你是不是发现自己竟然可以毫不费力地用自己不常用的手中&#xff0c;两根使用频率相对较低的手指&#xff0c;做一个不常做的动作。这就是人类大脑不可思议…

14-5 小语言模型SLM 百科全书

想象一下这样一个世界&#xff1a;智能助手不再驻留在云端&#xff0c;而是驻留在你的手机上&#xff0c;无缝理解你的需求并以闪电般的速度做出响应。这不是科幻小说&#xff1b;这是小型语言模型 (SLM) 的前景&#xff0c;这是一个快速发展的领域&#xff0c;有可能改变我们与…

台灯学生用哪个牌子最好?学生用台灯品牌排行榜分析

台灯学生用哪个牌子最好&#xff1f;护眼台灯在近年来成为家长和长时间使用电子设备人群关注的家电/学生产品。对于家中有孩子或经常面对电子屏幕的人士来说&#xff0c;很多人可能已经对这类产品有所了解并进行了购买。然而&#xff0c;部分家长对护眼台灯的认识还不够深入&am…

windows安装jdk21

下载 下载zip解压 设置环境变量 设置JAVA_HOME环境变量 Path环境变量添加如下值%HAVA_HOME%\bin 打开新的cmd&#xff0c;输入java --version查看效果

CentralCache中心缓存

目录 一.CentralCache基本结构 1.CentralCache任务 2.基本结构 二.函数调用层次结构/.h文件 三.Span和SpanList的封装 Span:大块内存跨度 PAGE_ID _pageId size_t _objSize _useCount SpanList:管理Span的双链表(桶锁) 四.获取大块内存GetOneSpan 五.FetchRangeObj输…

源代码防泄漏之反向沙箱方案的经验分享

反向沙箱&#xff08;Reverse Sandbox&#xff09;是一种安全技术&#xff0c;主要用于检测和分析恶意软件的行为。与传统沙箱不同&#xff0c;反向沙箱的重点在于模拟恶意软件的预期运行环境&#xff0c;以诱导恶意软件展示其真实行为。这种技术可以帮助安全专家更深入地理解恶…

四川蔚澜时代电子商务有限公司打造抖音电商服务新高地

在数字化浪潮汹涌澎湃的今天&#xff0c;电商行业以其独特的魅力和强大的市场潜力&#xff0c;成为了推动经济增长的新引擎。四川蔚澜时代电子商务有限公司&#xff0c;作为这个领域的佼佼者&#xff0c;正以其专业的服务、创新的理念和卓越的实力&#xff0c;引领抖音电商服务…

【Linux进阶】Linux目录配置,FHS

在了解了每个文件的相关种类与属性&#xff0c;以及了解了如何修改文件属性与权限的相关信息后&#xff0c;再来要了解的就是&#xff0c;为什么每个Linux发行版它们的配置文件、执行文件、每个目录内放置的东西&#xff0c;其实都差不多&#xff1f;原来是有一套标准依据&…

在 Mac 上使用 MLX 微调微软 phi3 模型

微调大语言模型是常见的需求&#xff0c;由于模型参数量大&#xff0c;即使用 Lora/Qlora 进行微调也需要 GPU 显卡&#xff0c;Mac M系是苹果自己的 GPU&#xff0c;目前主流的框架还在建立在 CUDA 的显卡架构&#xff0c;也就是主要的卡还是来自英伟达。如果要用 Mac 来做训练…

pnpm的坑

请问pnpm的两个坑怎么解决&#xff1a; 第一个坑&#xff1a;没有节省磁盘空间 我已经配置了依赖的存储位置&#xff0c; 但我在项目里pnpm install以后&#xff0c;发现依赖包还是很大&#xff0c; 然后发现里面的链接并不是指向先前配置的依赖存储位置&#xff0c;而是指…

中霖教育怎么样?注册会计师可以跨省考试吗?

中霖教育怎么样?注册会计师可以跨省考试吗? 1. 考试地点安排&#xff1a; 注册会计师考试是在全国范围内统一举行的&#xff0c;通常设在各省、自治区和直辖市指定的考区。考生须依据准考证上提供的信息&#xff0c;核实自己的具体考试地点。该考试实行的网上统一报名制度&…

DBeaver连接clickhouse最全教程

环境 clickhouse server 20.3 dbeaver 24.1.1.202406231636在使用 dbeaver 连接 clickhouse 的时候需要&#xff0c;它默认是没有驱动的&#xff0c;然后其默认会安装 clickhouse-jdbc的 latest 版本&#xff0c;比如当前最新的驱动版本为 0.6.2&#xff0c;然后等我去连接的时…