python多线程及协程

目录

进程和线程

串行和并行

多线程编程

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参数,使阻塞的函数等待。

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

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

相关文章

基于gpt4all的企业内部知识问答服务应用搭建

文章目录 痛点项目缘起技术选型fine-tuningfew shot prompt engineering选定方案的特征描述 模型赛马gpt4all调优部署时踩坑python3.9 header缺失 -- 安装下缺失的就行运行时参数调优 代码分析项目代码库代码 效果展示例子1例子2 附录:所用的公司内部API文档例子&am…

【Linux】—— 进程等待 waitwaitpid

序言: 之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。因此,为了解决这个问题,就需要用到有关 “进程等待” 的基本知识!!&am…

【沁恒蓝牙mesh】CH58x flash分区之利用随机数作为蓝牙mesh地址

本文主要介绍了 沁恒蓝牙芯片 CH58x 的flash 分区与数据存储管理,利用随机数作为蓝牙mesh地址,蓝牙mesh采用自组网 📋 个人简介 💖 作者简介:大家好,我是喜欢记录零碎知识点的小菜鸟。😎&#…

python实现简单的爬虫功能

前言 Python是一种广泛应用于爬虫的高级编程语言,它提供了许多强大的库和框架,可以轻松地创建自己的爬虫程序。在本文中,我们将介绍如何使用Python实现简单的爬虫功能,并提供相关的代码实例。 如何实现简单的爬虫 1. 导入必要的…

【网络编程】利用套接字实现一个简单的网络通信(UDP实现聊天室 附上源码)

网络编程套接字 🐛预备知识🦋理解源IP地址和目的IP地址🐌认识端口号🐞 理解 "端口号" 和 "进程ID"🐜简单认识TCP协议🦟简单认识UDP协议🦗 什么是网络字节序 🕷相…

《剑指offer》(5)搜索算法、位运算、模拟

方法一&#xff1a; class Solution: def GetNumberOfK(self , nums: List[int], k: int) -> int: #从两边开始找&#xff0c;找到之后记录当前位置 left 0 right len(nums) - 1 if k not in nums: return 0 start len(nums) - 1 end 0 while left < right: if nums…

Vue2源码分析-day1

初始化数据 vue中最核心的我们都知道那就是响应式数据&#xff0c;数据的变化视图自动更新。那么我们来new一个我们自己的vue 在index.html文件下加入如下代码&#xff0c;这也是vue最常见的基本结构。data已经有了下面我们来获取data的数据 <script src"./vue.js&qu…

[openCV]基于拟合中线的智能车巡线方案V3

import cv2 as cv import os import numpy as np# 遍历文件夹函数 def getFileList(dir, Filelist, extNone):"""获取文件夹及其子文件夹中文件列表输入 dir&#xff1a;文件夹根目录输入 ext: 扩展名返回&#xff1a; 文件路径列表"""newDir d…

『Samba』在Linux中实现高效访问和管理共享文件夹的基本操作与实践

&#x1f4e3;读完这篇文章里你能收获到 Samba 的安装和配置&#xff1a;详细介绍了如何在 Linux 操作系统上安装和配置 Samba 服务器共享文件夹的设置&#xff1a;指导如何选择要共享的文件夹&#xff0c;并为其设置共享名称、路径以及访问权限Samba 用户的创建&#xff1a;提…

C# App.config和Web.config加密

步骤1&#xff1a;创建加密命令 使用ASP.NET提供的命令工具aspnet_regiis来创建加密命令。 1、打开控制台窗口&#xff0c;在命令行中输入以下命令&#xff1a; cd C:\Windows\Microsoft.NET\Framework\v4.xxxxx aspnet_regiis.exe -pef connectionStrings "C:\MyAppFo…

搭建 elasticsearch8.8.2 伪集群 windows

下载windows 版本 elasticsearch8.8.2 以下链接为es 历史版本下载地址&#xff1a; Past Releases of Elastic Stack Software | Elastic windows 单节点建立方案&#xff1a; 下载安装包 elasticsearch-8.8.2-windows-x86_64.zip https://artifacts.elastic.co/download…

代码随想录算法训练营第51天|动态规划part09|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

代码随想录算法训练营第51天&#xff5c;动态规划part09&#xff5c;198.打家劫舍、213.打家劫舍II、337.打家劫舍III 198.打家劫舍 198.打家劫舍 思路&#xff1a; 仔细一想&#xff0c;当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。 所以这里就更感觉到&a…

机器学习鱼书笔记(自用更新)

零、预知识 1.Numpy 使用 介绍&#xff1a;高效的操作多维数组的函数库。 安装&#xff1a;&#xff08;前提已经安装了python&#xff09; pip install numpy导入 import numpy as np创建数组 Numpy最重要的数据结构是多维数组&#xff08;ndarray&#xff09;。通过Numpy&…

农商行基于分类分级的数据安全管控建设实践

《数据安全法》颁布实施以来&#xff0c;以分类分级为基础&#xff0c;对数据进行差异化管理和防护&#xff0c;成为行业共识。 金融行业作为数据密集的高地&#xff0c;安全是重中之重&#xff0c;而鉴于金融数据种类和内容庞杂&#xff0c;面临规模化用数、普惠用数、跨机构共…

分布式协议与算法——Paxos算法

目录 Paxos算法Basic Paxos算法三种角色如何达成共识&#xff08;协商过程&#xff09;小结&#xff1a; Multi-Paxos算法关于 Multi-Paxos 的思考领导者优化Basic PaxosChubby 的 Multi-Paxos 实现小结 参考 Paxos算法 Paxos论文 Paxos Made Simple 、author&#xff1a;Lesli…

wireshark 安装和使用

wireshark&#xff0c;世界上最受欢迎的网络协议分析器。是一个网络流量分析器&#xff0c;或“嗅探器”&#xff0c;适用于Linux、macOS、*BSD和其他Unix和类Unix操作系统以及Windows。它使用图形用户界面库Qt以及libpcap和npcap作为数据包捕获和过滤库。 wireshark&#xff…

Flamingo

基于已有的图像模型和文本模型构建多模态模型。输入是图像、视频和文本&#xff0c;输出是文本。 Vision encoder来自预训练的NormalizerFree ResNet (NFNet)&#xff0c;之后经过图文对比损失学习。图片经过图像模型的输出是2D grid&#xff0c;视频按1FPS的频率采样后经过图…

【2种方法,jmeter用一个正则提取器提取多个值!】

jmeter中&#xff0c;用json提取器&#xff0c;一次提取多个值&#xff0c;这个很多人都会。但是&#xff0c;用正则提取器一次提取多个&#xff0c;是否可以呢&#xff1f; 肯定&#xff0c;很多人都自信满满的说&#xff0c;可以&#xff01;形如&#xff1a;token":&q…

Python入门【​编辑、组合、设计模式_工厂模式实现 、设计模式_单例模式实现、工厂和单例模式结合、异常是什么?异常的解决思路 】(十七)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

matlab使用教程(10)—脚本和函数

1.概述 MATLAB 提供了一个强大的编程语言和交互式计算环境。您可以使用此语言在 MATLAB 命令行中一次输入一个命令&#xff0c;也可以向某个文件写入一系列命令&#xff0c;按照执行任何 MATLAB 函数的相同方式来执行这些命令。使用 MATLAB 编辑器或任何其他文件编辑器可以创建…