python多线程及协程

news2024/12/22 23:19:59

目录

进程和线程

串行和并行

多线程编程

Thread类

创建线程参数

具体案例 

继承Thread类

具体案例

线程池

具体案例

协程

协程的使用

协程函数写法

调用多个协程函数

main函数的写法

案例

进程和线程

进程:就是一个程序,运行在系统之上,那么便称这个程序为一个运行进程,并分配ID方便系统管理

线程:线程归于进程,一个进程可开启多个线程执行不同工作,线程是进程的实际工作最小单位

注意

  • 操作系统可以运行多个进程,即多任务运行,一个进程可以有多个线程,即多线程运行
  • 一个进程内至少有一个线程,启动一个程序默认都会有一个主线程
  • 进程之间是内存隔离的,即不同进程拥有各自的内存空间,这就类似于不同的公司拥有不同的办公场所
  • 线程之间是内存共享的,线程是属于进程的,一个进程内的多个线程之间共享这个进程所拥有的内存空间。

串行和并行

  • 串行:任务一个接一个的顺序进行
  • 并行:多个任务同时执行(需CPU的多个核)

多线程编程

Thread类

#导入线程模块
import threading
#创建线程
thread_obj=threading.thread([group],target,[name],[args],[kwargs])
#使线程处于就绪状态
thread_obj.start()

创建线程参数

  • group:暂时无用,未来功能的预留参数
  • target:执行的目标任务名
  • args:以元组的方式给执行任务传参
  • kwargs:以字典的方式给执行的任务传参
  • name:线程名

具体案例 

import threading
import time
def sing(msg):
    while True:
        print(msg)
        time.sleep(1)
def dance(email):
    while True:
        print(email)
        time.sleep(1)
if __name__ == '__main__':
    #因为target是第二个参数,所以必须给参数名进行传参
    sing_thread=threading.Thread(target=sing,args=("我在唱歌……",))
    dance_thread=threading.Thread(target=dance,kwargs={"email":"我在跳舞"})
    #启动线程
    sing_thread.start()
    dance_thread.start()

继承Thread类

from threading import Thread

class MyThread(Thread):
    #重写run方法
    def run(self):
        线程内执行的代码
#创建线程
thread=MyThread()
#让线程处于就绪状态
thread.start()

注意:线程被执行之后,被启动的便是重写后的run方法 

具体案例

from threading import Thread
class MyThread(Thread):
    #重写run方法
    def run(self):
        for i in range(100):
            print(f"子线程:{i}")
if __name__ == '__main__':
    thread=MyThread()
    #开始调用线程
    thread.start()
    for i in range(100):
        print(f"主线程:{i}")

线程池

含义:一次性开辟一些线程,我们用户直接给线程池提交任务,线程任务的调度交给线程池来完成

from concurrent.futures import ThreadPoolExecutor
#定义任务
def fn(任务参数):
    任务内执行的代码
#创建线程池,这里面的n表示创建n个线程的线程池
with ThreadPoolExecutor(n) as t:
    #提交任务
    t.submit(fn(任务参数))

具体案例

#导入线程池模块
from concurrent.futures import ThreadPoolExecutor
#定义任务
def fn(name):
    for i in range(100):
        print(name,i)
#main
if __name__ == '__main__':
    #创建线程池
    with ThreadPoolExecutor(50) as t:
        for i in range(100):
            #提交任务
            t.submit(fn("lili"))
    print("线程池的东西全部执行完毕!")

协程

前言:当程序出现IO操作时,可以选择性的切换到其他任务上。

理解:

  • 宏观上我们能看到的是多个任务一起执行
  • 微观上是一个任务一个任务的进行切换,切换条件一般是IO操作

注意:上方所讲的一切,都是在单线程的条件下

协程的使用

导入asyncio模块:import asyncio

协程函数写法

async def 函数名():
    函数体

注意:上面的函数为异步协程函数,函数执行后将会得到一个异步协程对象,若想要调用函数,则需要使用asyncio模块

协程对象=协程函数名()

调用单个协程函数:asyncio.run(协程对象)

import asyncio
async def func():
    print("hello")
if __name__ == '__main__':
    g=func()
    asyncio.run(g)

调用多个协程函数

语法:asyncio.run(main())

main函数的写法

#方法1
async def main():
    f1=协程函数1()
    await f1
    f2=协程函数2()
    await f2

#方法2
async def main():
    tasks=[
        #创建协程任务
        asyncio.create_task(fun1()),
        asyncio.create_task(fun2()),
        asyncio.create_task(fun3())
    ]
    await asyncio.wait(tasks)

案例

#导入协程模块
import asyncio
async def fun1():
    print("你好啊,我叫潘金莲")
    await asyncio.sleep(3)
    print("你好啊,我叫潘金莲")
async def fun2():
    print("你好啊,我叫周杰伦")
    await asyncio.sleep(2)
    print("你好啊,我叫周杰伦")
async def fun3():
    print("你好啊,我叫马保国")
    await asyncio.sleep(4)
    print("你好啊,我叫马宝国")
async def main():
    f1=fun1()
    await f1
    f2=fun2()
    await f2
    f3=fun3()
    await f3
if __name__ == '__main__':
    #一次性启动多个任务(异步协程方式)
    asyncio.run(main())

注意:当函数内部出现同步操作(time.sleep(n))时,异步就中断了,这时需要使用异步模块的sleep方法,对于阻塞的方法在前面加await参数,使阻塞的函数等待。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[每日习题]年终奖(动态规划) 迷宫问题(DFS+回溯)——牛客习题

hello,大家好,这里是bang___bang_,本篇记录2道牛客习题,年终奖(简单),迷宫问题(中等),如有需要,希望能有所帮助! 目录 1️⃣年终奖 2️⃣迷宫问…

Linux学习-1

Linux学习-1 1.文件系统的常识 本文主要引用鸟哥的Linux私房菜 1.1 常见的标识介绍 > [-][rwx][r-x][r--] > 1 234 567 890 1 为:代表这个文件名为目录或文件,本例中为文件(-); 234为:拥有者的权限…

MongoDB数据库操作及操作命令

目录 一、基础概念 二、安装mongod 三、命令交互数据库 (1)数据库命令 (2)集合命令 (3)文档命令 四、Mongoose (1)增加一条数据 (2)插入多个数据 &am…

React实现关键字高亮

先看效果&#xff1a; 实现很简单通过以下这个函数&#xff1a; highLight (text, keyword ) > {return text.split(keyword).flatMap(str > [<span style{{ color: red, fontWeight: bold }}>{keyword}</span>, str]).slice(1);}展示某段文本时调用该函数…

【从零开始学习JAVA | 第四十二篇】初学网络编程

目录 前言&#xff1a; 什么是网络编程&#xff1a; 网络编程的应用场景&#xff1a; 常见的软件架构&#xff1a; CS架构&#xff1a; BS架构&#xff1a; 网络编程三要素&#xff1a;​ 总结&#xff1a; 前言&#xff1a; 当今互联网已经渗透到我们日常生活的方方面…

【MongoDB】万字长文,命令与代码一一对应SpringBoot整合MongoDB之MongoTemplate

目录 一、导入依赖与配置信息 二、导入测试数据创建实体类 三、插入数据 1、Insert默认集合插入 2、Insert指定集合插入 3、Insert批量插入数据 4、save默认集合插入 5、save指定集合插入 6、insert与save的区别 四、修改数据 1、修改符合条件的第一条数据 2、全…

单例模式-java实现

介绍 单例模式的意图&#xff1a;保证某个类在系统中有且仅有一个实例。 我们可以看到下面的类图&#xff1a;一般的单例的实现&#xff0c;是属性中保持着一个自己的私有静态实例引用&#xff0c;还有一个私有的构造方法&#xff0c;然后再开放一个静态的获取实例的方法给外界…

golang内存对齐

为什么要内存对齐&#xff1f; CPU访问内存时&#xff0c;以CPU的位数为单位进行访问。 如果访问未对齐的内存&#xff0c;处理器需要做两次内存访问&#xff0c;对齐的内存的访问可能仅需要一次&#xff0c;利用内存对齐后提升读取速度。 golang结构体内存对齐规则 在代码编译…

MySql学习3:常用函数

常用字符串函数 CHAR_LENGTH(s)&#xff1a;返回字符串的长度 select *, char_length(name) as nameLength from emp;CONCAT(s1,s2…sn)&#xff1a;字符串拼接 select name,concat(name,入职时间&#xff1a;,entrydata) as 入职时间 from emp;CONCAT_WS(x, s1,s2…sn)&a…

24v转3.3v输出3A用什么芯片

问&#xff1a;客户需要一个能够将24V输入电压转换为3.3V输出电压&#xff0c;并且能够提供1-3A的电流输出的芯片。还希望它能够内置MOS管。有什么推荐的型号吗&#xff1f;&#xff08;vin24v、5v&#xff0c;vout3.3v&#xff0c;Io1-3A&#xff09; 答&#xff1a;推荐使用…

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy 经典塔防游戏&#xff0c;可发布PC、Andoid、IOS、Web等 下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88189987

【Spring Boot】Thymeleaf模板引擎 — Thymeleaf页面布局

Thymeleaf页面布局 熟悉Thymeleaf的语法和表达式后&#xff0c;后面开发起来会更加得心应手。接下来好好研究一下Thymeleaf如何实现完整的Web系统页面布局。 1.引入代码片段 在模板中经常希望包含来自其他模板页面的内容&#xff0c;如页脚、页眉、菜单等。为了做到这一点&a…

【从零开始学习JAVA | 三十九篇】深入多线程

目录 前言&#xff1a; ​1.线程的寿命周期​ 2.线程的安全问题 3.锁 同步代码块&#xff1a; 同步方法&#xff1a; 死锁&#xff1a; 4.生产者和消费者模式&#xff08;等待唤醒机制&#xff09; 总结&#xff1a; 前言&#xff1a; 当今软件开发领…

构建Docker容器监控系统(2)(Cadvisor +Prometheus+Grafana)

Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息&#xff0c;并以图表的形式向用户展示。 接着上一篇来继续 部署Cadvisor 被监控主机上部署Cadvisor容器…

Echart(v5)实现中国地图区域图

一、需求背景 需要实现一个中国地图的区域图&#xff08;区域级别到市&#xff09;&#xff0c;并且指定区域可以高亮。 二、相关工具 1、中国的GeoJSON数据获取&#xff1a;DataV.GeoAtlas地理小工具系列 2、Echart组件库 Apache ECharts 三、实现 echart配置&#xff1a; …

MySQL查看当前数据库视图-SQL语句

引言 查询语句为&#xff1a; show full tables where table_type 可查询当前数据库表 一&#xff0c;创建一个视图 # 创建视图 create view v_stu as # 视图内容&#xff08;连接的一个表&#xff09; select name from t_stu union all select tname from t_teach; 二&…

RISC-V云测平台:Compiling The Fedora Linux Kernel Natively on RISC-V

注释&#xff1a;编译Fedora&#xff0c;HS-2 64核RISC-V服务器比Ryzen5700x快两倍&#xff01; --- 以下是blog 正文 --- # Compiling The Fedora Linux Kernel Natively on RISC-V ## Fedora RISC-V Support There is ongoing work to Fedora to support RISC-V hardwar…

2.4 网络安全新技术

数据参考&#xff1a;CISP官方 目录 云计算安全大数据安全移动互联网安全物联网安全工业互联网安全 一、云计算安全 1、云计算定义 云计算是指通过网络访问可扩展的、灵活的物理或虚拟共享资源池&#xff0c;并按需自助获取和管理资源的模式。在云计算中&#xff0c;计算资…

Goland搭建远程Linux开发

Windows和Linux都需要先构建好go环境&#xff0c;启用ssh服务。 打开Windows上的Goland&#xff0c;建立项目。 点击添加配置&#xff0c;选择go构建 点击运行于&#xff0c;选择ssh 填上Linux机器的IP地址和用户名 输入密码 没有问题 为了不让每次运行程序和调试程序都生…

AIGC自动生成内容真的好吗

一、前言 博主认为某些技术领域的发展对人类而言&#xff0c;并没有多大的益处。反而让人类更加困扰。纵观这几十年的技术发展&#xff0c;日新月异&#xff0c;但是人类生活的幸福指数并没有提高&#xff0c;反而产生了无数的社会问题。 AI大模型迅速发展&#xff0c;A…