python异步

简介:

协程

微线程,纤程 -- Coroutine

子程序(函数) -- 所有语言中都是层级调用,子程序调用是一通过栈实现的,一个线程就是执行一个子程序。

子程序调用是明确的,一个入口,一次返回。

协程看上去像子程序,但在执行过程中可中断。有点像执行多线程,但是它是一个线程执行。

协程比多线程的优势:极高的执行效率,没有线程切换的开销;没有线程的锁机制。

使用协程利用多CPU的方式:多进程+协程


python对协程的支持通过generator实现。

通过for迭代,不断调用next()函数获取由yield返回的下一个值。

python的yield不但可以返回一个值,还可以接收调用者发出的参数。

生产者消费者通过yield的实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def  consumer():
     r = ''
     while  True :
         =  yield  r
         if  not  n:
             return
         print ( '[CONSUMER] Consuming %s...'  %  n)
         =  '200 OK'
         
def  produce(c):
     c.send( None )
     =  0
     while  n <  5 :
         =  n + 1
         print ( '[PRODUCER] Producing %s...'  %  n)
         =  c.send(n)
         print ( '[PRODUCER] Consumer return: %s'  %  r)
     c.close()
     
=  consumer()
produce(c)


asyncio

asyncio的编程模型就是一个消息循环。

实现异步IO -- 从asyncio模块中获取一个eventloop的引用,然后把需要执行的协程扔到eventloop中执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import  asyncio
 
@asyncio .coroutine
def  hello():
     print ( "hello, world!" )
     # 异步调用 asyncio.sleep(1)
     =  yield  from  asyncio.sleep( 1 )
     print ( "hello again!" )
 
# 获取eventloop        
loop  =  asyncio.get_event_loop()
# 执行conroutine
loop.run_until_complete(hello())
loop.close()


async/await

async和await是针对coroutine的新语法,只需要做两部简单的替换。

  1. 把@asyncio.coroutine替换为async

  2. 把yield from 替换为await

1
2
3
4
async  def  hello():
     print ( "hello world!" )
     =  await asyncio.sleep( 1 )
     print ( "hello again!" )


aiohttp

asyncio实现了TCP、UDP、SSL协议,aiohttp基于asyncio实现的http框架。

一个aiohttp实现的http服务器。分别处理以下URL:

/ -- 返回b'<h1>Index</h1>'

/hello/{name} -- 根据URL参数返回文本hello,%s!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import  asyncio
 
from  aiohttp  import  web
 
async  def  index(request):
     await asyncio.sleep( 0.5 )
     return  web.Response(body = b '<h1>Index</h1>' )
     
async  def  hello(request):
     await asyncio.sleep( 0.5 )
     text = '<h1>hello, %s!</h1>'  %  request.match_info[ 'name' ]
     return  web.Response(body = text.encode( 'utf-8' ))
     
async  def  init(loop):
     app  =  web.Application(loop = loop)
     app.router.add_route( 'GET' '/' , index)
     app.router.add_route( 'GET' '/hello/{name}' , hello)
     srv  =  await loop.create_server(app.make_handler(),  '127.0.0.1' 8000 )
     print ('Server started at 
     return  srv
     
     
loop  =  asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()















本文转自ting2junshui51CTO博客,原文链接:http://blog.51cto.com/ting2junshui/1753737  ,如需转载请自行联系原作者


相关文章
|
1月前
|
数据采集 Java Python
python并发编程:Python异步IO实现并发爬虫
python并发编程:Python异步IO实现并发爬虫
24 1
|
1月前
|
算法 数据处理 Python
Python并发编程:解密异步IO与多线程
本文将深入探讨Python中的并发编程技术,重点介绍异步IO和多线程两种常见的并发模型。通过对比它们的特点、适用场景和实现方式,帮助读者更好地理解并发编程的核心概念,并掌握在不同场景下选择合适的并发模型的方法。
|
15天前
|
调度 数据库 Python
【专栏】异步IO在处理IO密集型任务中的高效性
【4月更文挑战第27天】本文介绍了Python并发编程和异步IO,包括并发的基本概念(多线程、多进程、协程),线程与进程的实现(threading和multiprocessing模块),协程的使用(asyncio模块),以及异步IO的原理和优势。强调了异步IO在处理IO密集型任务中的高效性,指出应根据任务类型选择合适的并发技术。
|
2月前
|
数据采集 数据挖掘 调度
异步爬虫实践攻略:利用Python Aiohttp框架实现高效数据抓取
本文介绍了如何使用Python的Aiohttp框架构建异步爬虫,以提升数据抓取效率。异步爬虫利用异步IO和协程技术,在等待响应时执行其他任务,提高效率。Aiohttp是一个高效的异步HTTP客户端/服务器框架,适合构建此类爬虫。文中还展示了如何通过代理访问HTTPS网页的示例代码,并以爬取微信公众号文章为例,说明了实际应用中的步骤。
|
5天前
|
API UED Python
使用Python进行异步HTTP请求的实践指南
使用Python进行异步HTTP请求的实践指南
19 4
|
13天前
|
并行计算 数据处理 开发者
Python并发编程:解析异步IO与多线程
本文探讨了Python中的并发编程技术,着重比较了异步IO和多线程两种常见的并发模型。通过详细分析它们的特点、优劣势以及适用场景,帮助读者更好地理解并选择适合自己项目需求的并发编程方式。
|
16天前
|
人工智能 算法 调度
uvloop,一个强大的 Python 异步IO编程库!
uvloop,一个强大的 Python 异步IO编程库!
25 2
|
17天前
|
API 调度 开发者
Python中的并发编程:使用asyncio库实现异步IO
传统的Python编程模式中,使用多线程或多进程实现并发操作可能存在性能瓶颈和复杂性问题。而随着Python 3.5引入的asyncio库,开发者可以利用异步IO来更高效地处理并发任务。本文将介绍如何利用asyncio库实现异步IO,提升Python程序的并发性能。
|
23天前
|
数据采集 缓存 算法
使用Python打造爬虫程序之Python中的并发与异步IO:解锁高效数据处理之道
【4月更文挑战第19天】本文探讨了Python中的并发与异步IO,区分了并发(同时处理任务)与并行(同时执行任务)的概念。Python的多线程受限于GIL,适合IO密集型任务,而多进程适用于CPU密集型任务。异步IO通过非阻塞和回调/协程实现高效IO,Python的asyncio库提供了支持。应用场景包括Web开发和网络爬虫等。实践指南包括理解任务类型、使用asyncio、避免阻塞操作、合理设置并发度和优化性能。理解并运用这些技术能提升Python程序的效率和性能。
|
25天前
|
开发者 Python
Python中的并发编程:使用asyncio模块实现异步任务
传统的Python编程中,使用多线程或多进程进行并发操作时,常常会面临性能瓶颈和资源竞争的问题。而随着Python 3.5版本的引入,asyncio模块为开发者提供了一种基于协程的异步编程方式。本文将介绍如何使用asyncio模块实现异步任务,提高Python程序的并发处理能力。