我正在尝试自学
Python的异步功能.为此,我构建了一个异步Web scraper.我想限制我一次打开的连接总数,以成为服务器上的好公民.我知道信号量是一个很好的解决方案,而asyncio库内置了一个
semaphore类.我的问题是Python在异步函数中使用yield时会抱怨,因为你要结合yield和等待语法.以下是我正在使用的确切语法…
import asyncio
import aiohttp
sema = asyncio.BoundedSemaphore(5)
async def get_page_text(url):
with (yield from sema):
try:
resp = await aiohttp.request('GET', url)
if resp.status == 200:
ret_val = await resp.text()
except:
raise ValueError
finally:
await resp.release()
return ret_val
提出这个例外:
File "", line 14
with (yield from sema):
^
SyntaxError: 'yield from' inside async function
我能想到的一些可能的解决方案……
>只需使用@ asyncio.coroutine装饰器即可
>使用threading.Semaphore?这似乎可能会导致其他问题
>在this的beta版中尝试使用this的原因.
我是Python的异步功能的新手,所以我可能会遗漏一些明显的东西.