作家
登录

Python协程:概念及其用法

作者: 来源: 2017-06-15 17:02:36 阅读 我要评论

把asyncio.sleep(1)算作是一个耗时1秒的IO操作,在此时代,主线程并未等待,而是去履行EventLoop中其他可以履行的coroutine了,是以可以实现并发履行。

asynico/await

为了简化并更好地标识异步IO,大年夜Python 3.5开端惹人了新的语法async和await,可以让coroutine的代码更简洁易读。

  1. test_1 3 
  2.  
  3. test_1 4 
  4.  
  5. test_1 0 
  6.  
  7. test_1 1 
  8.  
  9. test_1 2 
  10.  
  11. test_2 3 
  12.  
  13. test_2 0 
  14.  
  15. test_2 2 
  16.  
  17. test_2 4 
  18.  
  19. test_2 1  

请留意,async和await是针对coroutine的新语法,要应用新的语法,只须要做两步简单的调换:

把@asyncio.coroutine调换为async;

把yield from调换为await。

Usage

例子(python3.5今后版本应用):

  1. import asyncio 
  2.  
  3. async def test(i): 
  4.  
  5. print("test_1",i) 
  6.  
  7. await asyncio.sleep(1) 
  8.  
  9. print("test_2",i) 
  10.  
  11. loop=asyncio.get_event_loop() 
  12.  
  13. tasks=[test(i) for i in range(5)] 
  14.  
  15. loop.run_until_complete(asyncio.wait(tasks)) 
  16.  
  17. loop.close()  

运行结不雅与之前一致。

解释:与前一节比拟,这里只是把yield from换成了await,@asyncio.coroutine换成了async,其余不变。

gevent

同python2.x用法一样。

协程VS多线程

如不雅经由过程以上介绍,你已经明白多线程与协程的不合之处,那么我想测试也就没有须要了。因为当线程越来越多时,多线程重要的开销花费在线程切换上,而协程是在一个线程内切换的,是以开销小很多,这也许就是两者机能的根本差别之处吧。(小我不雅点)

异步爬虫

也许关怀协程的同伙,大年夜部分是用其写爬虫(因为协程能很好的解决IO壅塞问题),然而我发明常用的urllib、requests无法与asyncio结合应用,可能是因为爬虫模块本身是同步的(也可能是我没找到用法)。那么对于异步爬虫的需求,又该怎么应用协程呢?或者说袈末路么编写异步爬虫?

给出几个我所懂得的筹划:

  • grequests (requests模块的异步化)
  • 爬虫模块+gevent(比较推荐这个)
  • aiohttp (这个貌似资涟?绵,今朝我也不太会用)
  • asyncio内置爬虫功能 (这个也比较难用)

协程池

感化:控制协程数量

  1. from bs4 import BeautifulSoup 
  2.  
  3. import requests 
  4.  
  5. import gevent 
  6.  
  7. from gevent import monkey, pool 
  8.  
  9. monkey.patch_all() 
  10.  
  11. jobs = [] 
  12.  
  13. links = [] 
  14.  
  15. p = pool.Pool(10) 
  16.  
  17. urls = [ 
  18.  
  19.     'http://www.google.com'
  20.  
  21.     # ... another 100 urls 
  22.  
  23.  
  24. def get_links(url): 
  25.  

      推荐阅读

      Linux常用性能分析命令

    机能分析vmstat虚拟内存统计用法Usage: vmstat [options] [delay [count]] Options: -a, --active active/inactive memory -f, --forks number of forks since boot -m, --slabs slabinfo -n, --one-header do>>>详细阅读


    本文标题:Python协程:概念及其用法

    地址:http://www.17bianji.com/lsqh/35784.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)