想用协程试试访问网站结果遇到问题.
@types.coroutine
def urlopen(url):
html = yieldurllib.request.open(url)
return html
async def query(url):
response = await urlopen(url)
html = response.read()[:100]
print(html)
运行报错:
TypeErro: A Future, a coroutine or an awaitable is required.
我之前是直接在query()
里面使用await urllib.request.urlopen()
的,结果也报这个错,后来就改成把访问 url 用types.coroutine
变成成协程,可是还是报这个错。
所以想请教一下。 我想知道的是,我的思路是错的还是说实现的方式有问题。 感谢!
1
wwwjfy 2016-06-26 22:30:05 +08:00
query 已经是一个 coroutine 了,直接在里面进行网络请求就行了啊, urllib 不是 asyncio ,干嘛要 await
response = urllib.xxx(xxx) 就行了 PS, tab 和空格混用是什么风格... |
2
feather12315 2016-06-26 22:33:27 +08:00 via Android
`urllib`库不属于`future`类。应使用`aiohttp`,或从`socket`写
|
3
v2014 2016-06-26 22:36:05 +08:00
await 后面跟的也要是异步的函数
|
5
agnewee OP @feather12315 这样啊,我早先考虑到可能是这个原因,但是没有深入想。感谢,我回头再好好研究研究。
|
7
leavic 2016-06-27 09:50:23 +08:00
urllib 里的库还是传统的 blocking mode 函数,异步对它没有意义。
|
9
wwwjfy 2016-06-27 17:57:36 +08:00
用 asyncio 跟 IO 相关的都得用它,除了原生,实际使用中没看到太大好处,不如用 gevent ~
控制确实更精细些,以后第三方库们成熟了可以考虑 |
10
SuperFashi 2016-06-27 18:45:55 +08:00 via Android
这意思就跟你不能用 time.sleep 只能用 asyncio.sleep 一样
|