分享之python 协程

简介: 分享之python 协程

线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。


协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。


协程的适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程;


event loop是协程执行的控制点, 如果你希望执行协程, 就需要用到它们。


event loop提供了如下的特性:


   注册、执行、取消延时调用(异步函数)

   创建用于通信的client和server协议(工具)

   创建和别的程序通信的子进程和协议(工具)

   把函数调用送入线程池中


协程示例:

import asyncio
async def cor1():
    print("COR1 start")
    await cor2()
    print("COR1 end")
async def cor2():
    print("COR2")
loop = asyncio.get_event_loop()
loop.run_until_complete(cor1())
loop.close()


最后三行是重点。


   asyncio.get_event_loop()  : asyncio启动默认的event loop

   run_until_complete()  :  这个函数是阻塞执行的,知道所有的异步函数执行完成,

   close()  :  关闭event loop。


1、greenlet


import greenlet
def fun1():
    print("12")
    gr2.switch()
    print("56")
    gr2.switch()
def fun2():
    print("34")
    gr1.switch()
    print("78")
gr1 = greenlet.greenlet(fun1)
gr2 = greenlet.greenlet(fun2)
gr1.switch()


2、gevent


gevent属于第三方模块需要下载安装包

    pip3 install --upgrade pip3
    pip3 install gevent
import gevent
def fun1():
    print("www.baidu.com")   # 第一步
    gevent.sleep(0)
    print("end the baidu.com")  # 第三步
def fun2():
    print("www.zhihu.com")   # 第二步
    gevent.sleep(0)
    print("end th zhihu.com")  # 第四步
gevent.joinall([
    gevent.spawn(fun1),
    gevent.spawn(fun2),
])
遇到IO操作自动切换:
import gevent
import requests
def func(url):
    print("get: %s"%url)
    gevent.sleep(0)
    date =requests.get(url)
    ret = date.text
    print(url,len(ret))
gevent.joinall([
    gevent.spawn(func, 'https://www.python.org/'),
    gevent.spawn(func, 'https://www.yahoo.com/'),
    gevent.spawn(func, 'https://github.com/'),
])
相关文章
|
1月前
|
安全 调度 Python
探索Python中的并发编程:协程与多线程的比较
本文将深入探讨Python中的并发编程技术,重点比较协程与多线程的特点和应用场景。通过对协程和多线程的原理解析,以及在实际项目中的应用案例分析,读者将能够更好地理解两种并发编程模型的异同,并在实践中选择合适的方案来提升Python程序的性能和效率。
|
5天前
|
数据挖掘 程序员 调度
Python并发编程之协程与异步IO
传统的多线程和多进程模型在处理大规模并发时存在一些性能瓶颈和资源消耗问题。本文将重点介绍Python中基于协程和异步IO的并发编程方法,探讨其工作原理和实际应用,帮助开发者更好地理解并利用Python的并发编程能力。
|
5天前
|
开发者 Python
探索 Python 中的协程:从基本概念到实际应用
在现代编程中,异步处理变得越来越重要,Python 通过其内置的协程提供了强大的工具来简化这一过程。本文将深入探讨 Python 中的协程,从基本概念出发,逐步展示其实际应用,并通过具体代码示例帮助你掌握这种技术。
|
3天前
|
安全 Unix API
完整了解如何在python中处理协程和流
【6月更文挑战第25天】本文介绍异步库asyncio的概念和用法,异步编程在Python中是通过事件循环和协程实现并发,随着版本更新,API有所变化。
23 1
|
11天前
|
数据挖掘 调度 开发者
Python并发编程的艺术:掌握线程、进程与协程的同步技巧
并发编程在Python中涵盖线程、进程和协程,用于优化IO操作和响应速度。`threading`模块支持线程,`multiprocessing`处理进程,而`asyncio`则用于协程。线程通过Lock和Condition Objects同步,进程使用Queue和Pipe通信。协程利用异步事件循环避免上下文切换。了解并发模型及同步技术是提升Python应用性能的关键。
37 5
|
13天前
|
调度 开发者 UED
探索Python中的异步编程:从回调到协程
【6月更文挑战第14天】本文深入探讨了Python异步编程的演变历程,从最初的回调函数到现代的协程模型。我们将通过具体示例,展示如何利用asyncio库提升程序的执行效率和响应能力。文章旨在为读者提供一个清晰的异步编程发展脉络,并指导他们如何在项目中实际应用这些技术。
|
23天前
|
JavaScript 前端开发 程序员
Python协程与asyncio
理解Python中的协程,我们需从其底层原理开始,逐步深入。协程的核心在于控制流的非阻塞式管理,它允许在单一线程内实现并发处理,通过事件循环和协作式多任务来提高效率。
|
11天前
|
Java 开发者 计算机视觉
探索Python中的并发编程:线程与协程
本文将深入探讨Python中的并发编程,重点比较线程和协程的工作机制、优缺点及其适用场景,帮助开发者在实际项目中做出更明智的选择。
|
1月前
|
调度 Python
探索Python中的异步编程:从回调到协程
本文将介绍Python中的异步编程技术,从最初的回调函数到现代的协程模型。通过对比传统的同步编程方式和异步编程的优劣势,我们深入探讨了Python中异步编程的实现原理,以及如何利用asyncio库和async/await关键字来构建高效的异步应用程序。最后,我们还将讨论一些异步编程的最佳实践和常见问题的解决方法。
|
1月前
|
消息中间件 安全 调度
基于Python的性能优化(线程、协程、进程)
一、多线程 在CPU不密集、IO密集的任务下,多线程可以一定程度的提升运行效率。