把asyncio.sleep(1)算作是一个耗时1秒的IO操作,在此时代,主线程并未等待,而是去履行EventLoop中其他可以履行的coroutine了,是以可以实现并发履行。
asynico/await
为了简化并更好地标识异步IO,大年夜Python 3.5开端惹人了新的语法async和await,可以让coroutine的代码更简洁易读。
- test_1 3
- test_1 4
- test_1 0
- test_1 1
- test_1 2
- test_2 3
- test_2 0
- test_2 2
- test_2 4
- test_2 1
请留意,async和await是针对coroutine的新语法,要应用新的语法,只须要做两步简单的调换:
把@asyncio.coroutine调换为async;
把yield from调换为await。
Usage
例子(python3.5今后版本应用):
- import asyncio
- async def test(i):
- print("test_1",i)
- await asyncio.sleep(1)
- print("test_2",i)
- loop=asyncio.get_event_loop()
- tasks=[test(i) for i in range(5)]
- loop.run_until_complete(asyncio.wait(tasks))
- loop.close()
运行结不雅与之前一致。
解释:与前一节比拟,这里只是把yield from换成了await,@asyncio.coroutine换成了async,其余不变。
gevent
同python2.x用法一样。
协程VS多线程
如不雅经由过程以上介绍,你已经明白多线程与协程的不合之处,那么我想测试也就没有须要了。因为当线程越来越多时,多线程重要的开销花费在线程切换上,而协程是在一个线程内切换的,是以开销小很多,这也许就是两者机能的根本差别之处吧。(小我不雅点)
异步爬虫
也许关怀协程的同伙,大年夜部分是用其写爬虫(因为协程能很好的解决IO壅塞问题),然而我发明常用的urllib、requests无法与asyncio结合应用,可能是因为爬虫模块本身是同步的(也可能是我没找到用法)。那么对于异步爬虫的需求,又该怎么应用协程呢?或者说袈末路么编写异步爬虫?
给出几个我所懂得的筹划:
- grequests (requests模块的异步化)
- 爬虫模块+gevent(比较推荐这个)
- aiohttp (这个貌似资涟?绵,今朝我也不太会用)
- asyncio内置爬虫功能 (这个也比较难用)
协程池
感化:控制协程数量
- from bs4 import BeautifulSoup
- import requests
- import gevent
- from gevent import monkey, pool
- monkey.patch_all()
- jobs = []
- links = []
- p = pool.Pool(10)
- urls = [
- 'http://www.google.com',
- # ... another 100 urls
- ]
- def get_links(url):
推荐阅读
机能分析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
1/2 1

网友点评
精彩导读
科技快报
品牌展示