深化了解协程的经常使用和长处-Python中的协程 (深化 协同)
在当今高度互联的环球中,编写高效且照应迅速的程序是至关关键的。/target=_blankclass=infotextkey>Python作为一种性能弱小且易于经常使用的编程言语,提供了许多工具来成功异步编程。其中,协程是一项弱小的技术,可以协助咱们编写高效的异步代码。本文将深化引见Python中的协程,并经过活泼的例子提醒其魔力。
什么是协程?
协程是一种轻量级的线程,可以在代码口头的不同局部之间启动切换,而不须要启动低廉的线程高低文切换操作。它们通罕用于处置长期间运转的义务,如网络恳求、数据库查问或IO操作。协程不同于个别的函数调用,它可以在义务之间暂停和复原口头,这使得咱们能够更好地利用系统资源,并成功高效的并发编程。
Python中的协程:
在Python中,咱们可以经常使用asyncio库来创立和治理协程。首先,让咱们来看一个便捷的示例:
importasyncio#定义一个协程函数asyncdefgreet(name):print(f"Hello,{name}!")awtasyncio.sleep(1)#模拟耗时操作print("Nicetomeetyou!")#创立事情循环loop=asyncio.get_event_loop()#调用协程函数coroutine=greet("Alice")#将协程减少到事情循环中并运转loop.run_until_complete(coroutine)
在上方的代码中,咱们首先定义了一个协程函数greet,它接受一个称号作为参数并打印问候消息。而后,咱们经常使用asyncio.get_event_loop()创立了一个事情循环。接上去,咱们调用协程函数greet并将其前往的协程对象赋值给coroutine变量。最后,咱们经常使用loop.run_until_complete()将协程减少到事情循环并运转。
在协程函数外部,咱们经常使用await关键字来指定一个耗时操作。在本例中,咱们经常使用asyncio.sleep(1)模拟一个耗时1秒的操作。当协程遇到await语句时,它会暂停口头,并将控制权前往给事情循环。一旦耗时操作成功,协程将复原口头,并继续口头后续的代码。
协程的长处:
协程在异步编程中具备许多长处。首先,它们准许咱们编写顺序的、易于了解的代码,而无需经常使用复杂的回调机制。其次,协程可以更高效地利用系统资源,由于它们防止了线程高低文切换的开支。此外,Python的协程模型还提供了丰盛的工具和库,用于处置并发和并行义务,如asyncio和aiohttp。
一个实在的运行案例:Web爬虫
协程在Web爬虫中有着宽泛的运行。假定咱们须要从多个网页中抓取数据,并且这些网页的下载和解析都是耗时的操作。经常使用协程可以大大提高爬虫的效率。
上方是一个便捷的Web爬虫示例,经常使用协程成功并发的数据抓取:
importasyncioimportaiohttpasyncdeffetch(url):asyncwithaiohttp.ClientSession()assession:asyncwithsession.get(url)asresponse:returnawaitresponse.text()asyncdefmain():urls=["https://example.com/page1","https://example.com/page2","https://example.com/page3",#更多URL...]tasks=[fetch(url)forurlinurls]results=awaitasyncio.gather(*tasks)#处置抓取结果forurl,resultinzip(urls,results):print(f"URL:{url}")print(f"Result:{result}")print("--------------------")#创立事情循环并运转爬虫loop=asyncio.get_event_loop()loop.run_until_complete(main())
在上述代码中,咱们定义了一个fetch协程函数,它经常使用aiohttp库发送HTTP恳求并前往照应的文本内容。在main函数中,咱们定义了要抓取的URL列表,并创立了一个协程义务列表tasks。而后,咱们经常使用asyncio.gather函数并发地口头这些义务,并期待一切义务成功。
经过经常使用协程和asyncio.gather,咱们可以同时动员多个HTTP恳求,并在一切恳求成功后启动结果处置。这种并发的形式大大提高了爬虫的效率,使咱们能够更极速地失掉所需的数据。
小结:协程是Python中弱小的异步编程工具,可以协助咱们编写高效、照应迅速的代码。经过经常使用asyncio库,咱们可以轻松地创立和治理协程,并享用其带来的诸多好处。在Web爬虫等实践运行中,协程能够极大地提高程序的并发性和效率。宿愿本文对你了解Python中的协程有所协助,并能在实践名目中加以运行。让咱们一同探求协程的魔力,构建更杰出的异步运行程序吧!
简述python进程,线程和协程的区别及应用场景
协程多与线程进行比较1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU。 2) 线程进程都是同步机制,而协程则是异步3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态
Python协程之asyncio
asyncio 是 Python 中的异步IO库,用来编写并发协程,适用于IO阻塞且需要大量并发的场景,例如爬虫、文件读写。
asyncio 在 Python3.4 被引入,经过几个版本的迭代,特性、语法糖均有了不同程度的改进,这也使得不同版本的 Python 在 asyncio 的用法上各不相同,显得有些杂乱,以前使用的时候也是本着能用就行的原则,在写法上走了一些弯路,现在对 Python3.7+ 和 Python3.6 中 asyncio 的用法做一个梳理,以便以后能更好的使用。
协程,又称微线程,它不被操作系统内核所管理,而完全是由程序控制,协程切换花销小,因而有更高的性能。
协程可以比作子程序,不同的是,执行过程中协程可以挂起当前状态,转而执行其他协程,在适当的时候返回来接着执行,协程间的切换不需要涉及任何系统调用或任何阻塞调用,完全由协程调度器进行调度。
Python 中以 asyncio 为依赖,使用 async/await 语法进行协程的创建和使用,如下 async 语法创建一个协程函数:
在协程中除了普通函数的功能外最主要的作用就是:使用 await 语法等待另一个协程结束,这将挂起当前协程,直到另一个协程产生结果再继续执行:
()是 asyncio 包内置的协程函数,这里模拟耗时的IO操作,上面这个协程执行到这一句会挂起当前协程而去执行其他协程,直到sleep结束,当有多个协程任务时,这种切换会让它们的IO操作并行处理。
注意,执行一个协程函数并不会真正的运行它,而是会返回一个协程对象,要使协程真正的运行,需要将它们加入到事件循环中运行,官方建议 asyncio 程序应当有一个主入口协程,用来管理所有其他的协程任务:
在 Python3.7+ 中,运行这个 asyncio 程序只需要一句: (main()),而在 Python3.6 中,需要手动获取事件循环并加入协程任务:
事件循环就是一个循环队列,对其中的协程进行调度执行,当把一个协程加入循环,这个协程创建的其他协程都会自动加入到当前事件循环中。
其实协程对象也不是直接运行,而是被封装成一个个待执行的 Task ,大多数情况下 asyncio 会帮我们进行封装,我们也可以提前自行封装 Task 来获得对协程更多的控制权,注意,封装 Task 需要 当前线程有正在运行的事件循环 ,否则将引 RuntimeError,这也就是官方建议使用主入口协程的原因,如果在主入口协程之外创建任务就需要先手动获取事件循环然后使用底层方法_task() ,而在主入口协程之内是一定有正在运行的循环的。任务创建后便有了状态,可以查看运行情况,查看结果,取消任务等:
_task()是 Python3.7 加入的高层级API,在 Python3.6,需要使用低层级_future()来创建 Future,Future 也是一个管理协程运行状态的对象,与 Task 没有本质上的区别。
通常,一个含有一系列并发协程的程序写法如下(Python3.7+):
并发运行多个协程任务的关键就是(*tasks) ,它接受多个协程任务并将它们加入到事件循环,所有任务都运行完成后会返回结果列表,这里我们也没有手动封装 Task,因为 gather 函数会自动封装。
并发运行还有另一个方法(tasks) ,它们的区别是:
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。