Python中协程(coroutine)详解

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

嗨喽~大家好呀,这里是魔王呐 ❤ ~!

python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取

一、协程和线程的比较及其适用场景

1 共用变量问题

多线程中可能出现多个线程争抢变量,所以变量需要加锁;

协程中任一时刻都只有一个线程,所以变量不需要加锁。

但是协程虽然不像多线程争抢变量但仍是和多线程一样共用变量的,即共用变量在某处改变在另外一处引用时也会发生改变。

2 协程的适用场景

从资源角度说,协程只有一个线程只能使用一个cpu核,所以它适合用于IO密集(包括磁盘IO和网络IO)函数,并不适用于计算密集函数。

从事情重复性说,协程类似多线程,适用于被反复调用的函数(for或while),也可用于做不同事情的多个函数。

3 协程的切换

线程是由操作系统来控制切换的,并不需要我们自己来调度;

但协程在操作系统中表现为一个线程,其调度操作系统无能为力,只得我们自己来实现。

await关键字表示该位置阻塞时可让出cpu执行,即切换到下一协程运行;

但追根究底对我们而言好像只有await asyncio.sleep()(另外还有future但这个暂不考虑吧)。

所以各协程间一定要在某个地方(尤其是循环内)使用await asyncio.sleep()谦让给其他协程,不然如果协程一直不谦让那其他协程,那其他协程只能等该协程运行完才能运行了。

二、协程代码实现

1 协程函数的定义

正常函数怎么写就怎么写,在def前面加上async即可。如:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)
2 协程函数的调用

入口函数使用asyncio.run() 进行调用。如:

import asyncio


async def main():
    print(f"started at 
Python 协程Coroutine 定义 协程,又称微线程,纤程。英文名Coroutine。通过 async/await 语法进行声明。需要 Python 3.7+ 特点 协程的特点在于是一个线程执行,可以处理IO密集型程序的效率问题,但是处理CPU密集型不是它的长处,如要充分发挥CPU利用率可以结合多进程+协程。 优势 最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。 第二大优势就是不需要多线程的锁机制,因.. 阅读详情

相关推荐

Python协程讲解

上篇文章我们说过由于GIL锁的限制,导致Python不能充分利用多线程来实现高并发,在某些情况下使用多线程可能比单线程效率更低,所以Python中出现了协程协程coroutine)又称微线程,是一中轻量级的线程,它可以在函数的特定位置暂停或恢复,同时调用者可以从协程中获取状态或将状态传递给协程。进程和线程都是通过CPU的调度实现不同任务的有序执行,而协程是由用户程序自己控制调度的,也没有线程切换的开销,所以执行效率极高。 生成器方式实现 早先的协程是使用生成器关键字yield来实现的,和生成器很相.

weixin_50097774的博客 3656

Python协程(Coroutine)

协程概念和代码使用

蓝魔的博客 6018

理解Python协程(Coroutine)

本文就生成器和协程做了一些学习、探究和总结,不过并没有做过多深入深入的研究。权且作为入门到一个笔记,之后将会尝试自己实现一下异步API,希望有助于理解学习

weixin_73136678的博客 1235

Python——协程(Coroutine),异步IO

目录生成器(Generator)yield表达式的使用生产者和消费者模型​编辑 yield from表达式协程(Coroutine)@asyncio.coroutineasync/await总结由于GIL的存在,导致Python多线程性能甚至比单线程更糟。 于是出现了协程Coroutine)这么个东西。协程由于由程序主动控制切换,没有线程切换的开销,所以执行效率极高。对于IO密集型任务非常适用,如果是cpu密集型,推荐多进程+协程的方式。在Python3.4之前,官方没有对协程的支持,存在一些三方库的实现

m0_56134806的博客 1966

python协程 (Coroutine) 详解

python协程

唐古的博客 605

Python异步编程终极指南:asyncio.coroutine协程装饰器详解

Python异步编程已成为现代高效应用开发的核心技术,而`asyncio.coroutine`协程装饰器正是掌握Python协程编程的关键入口点。在这篇完整指南中,我们将深入探讨asyncio协程装饰器的原理、用法和最佳实践,帮助您快速掌握Python异步编程的核心概念。 ## 什么是asyncio.coroutine协程装饰器? 🤔 `asyncio.coroutine`是Python标准

gitblog_00260的博客 440

python携程百万并发_Python并发编程协程(Coroutine)之Gevent详解

基本概念我们通常所说的协程Coroutine其实是corporateroutine的缩写,直接翻译为协同的例程,一般我们都简称为协程。在linux系统中,线程就是轻量级的进程,而我们通常也把协程称为轻量级的线程即微线程。进程和协程下面对比一下进程和协程的相同点和不同点:相同点:我们都可以把他们看做是一种执行流,执行流可以挂起,并且后面可以在你挂起的地方恢复执行,这实际上都可以看做是continua...

weixin_39621456的博客 202

python 协程和异步的关系_asyncio异步IO--协程Coroutine)与任务(Task)详解

说明:本文翻译自Coroutines and Tasks,主要介绍asyncio中用于处理协程和任务的方法和接口。在翻译过程中,译者在官方文档的基础上增加了部分样例代码和示意图表,以帮助读者对文档的理解。本文所述内容主要针对Python3.7,对3.7之前的版本有可能不适用,敬请注意。原创内容,转载请注明出处。译者:马鸣谦协程协程(coroutines)是通过async/await定义函数或方法,...

weixin_39819283的博客 633

python异步io协程读文件_asyncio异步IO--协程Coroutine)与任务(Task)详解

说明:本文翻译自Coroutines and Tasks,主要介绍asyncio中用于处理协程和任务的方法和接口。在翻译过程中,译者在官方文档的基础上增加了部分样例代码和示意图表,以帮助读者对文档的理解。本文所述内容主要针对Python3.7,对3.7之前的版本有可能不适用,敬请注意。原创内容,转载请注明出处。译者:马鸣谦协程协程(coroutines)是通过async/await定义函数或方法,...

weixin_39668408的博客 689

Python 3.X | (multi/sub)process、threading、coroutine(进程、线程、协程详解;堆栈、队列简介)之概念篇

一、概念 1、区别 2、形象举例 二、例子

神是念着倒 721

C++20协程实战:从原理到构建高性能服务器框架

协程是一种轻量级的用户态线程,它允许在单线程内实现并发执行,通过挂起和恢复机制避免线程切换开销。其核心原理在于将函数执行状态保存在堆上,实现非抢占式的协作式多任务。在服务器开发领域,协程技术能显著提升高并发场景下的性能表现,尤其适用于I/O密集型应用,如网络服务器、微服务网关等。通过C++20标准提供的无栈协程机制,开发者可以构建高度定制化的异步运行时,将传统的回调地狱转化为顺序执行的同步代码风格,同时保持底层的高效并发。本文基于C++20协程,深入解析Promise、Awaitable、Coroutine

banglvfei0870的博客 406

asyncio.run()不再阻塞主线程?Python 3.15三大异步启动模式对比,90%开发者尚未启用的零开销协程注入法

Python 3.15异步I/O模型优化带来启动范式变革:asyncio.run()默认非阻塞,新增显式事件循环绑定、协程注入与嵌套调度三大模式。适用于Web服务、CLI工具及混合同步/异步场景,零开销注入协程提升启动性能30%以上。值得收藏

CompiGap的博客 214

Python asyncio 异步编程全套学习文档(零基础完整版)

本文档整合 Python 异步编程全部核心知识点、易错坑、代码模板、面试重点,剔除晦涩理论,只保留实用、可落地的内容,适合入门、复习、面试刷题、项目开发

大一点的小孩 691

Python异步代码加上类型提示(Type Hints)

本文将深入探讨如何为异步代码添加类型提示,涵盖协程类型标注、泛型在异步中的运用等实用技巧。若返回值可直接标注为具体类型(如`dict`),但需注意`asyncio`任务需用`asyncio.Task[dict]`明确泛型。异步生成器或异步迭代器需使用`AsyncIterable`/`AsyncIterator`。异步上下文管理器(`async with`)需结合`AsyncContextManager`类型。异步函数的核心是协程,其返回值需通过`Coroutine`或`Awaitable`标注。

khrepg_726的博客 40

深入理解 Python 协程

协程Coroutine),也称为微线程、纤程。英文名Coroutine协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。

pythonhy的博客 266

【仅限前500名开放】Python异步I/O密钥手册:包含17个未公开的_event_loop._run_once()底层钩子与3个CPython 3.12新异步API抢先实践

深入掌握Python异步I/O教程,高效解决高并发I/O瓶颈。详解_event_loop._run_once()底层钩子调用、CPython 3.12新增异步API实践,覆盖Web服务、实时爬虫与微服务场景。性能提升显著,调试更可控,值得收藏。

SimSolve的博客 211
上一篇: 【python】某牙小姐姐在线抓取,多个视频翻页下载
下一篇: Python中重要的条件语句教程
魔王不会哭
博客等级 码龄5年 6002粉丝 394原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值