python3.5 中的 async/await 使用问题

2016-06-26 22:07:42 +08:00
 agnewee

想用协程试试访问网站结果遇到问题.

@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变成成协程,可是还是报这个错。

所以想请教一下。 我想知道的是,我的思路是错的还是说实现的方式有问题。 感谢!

4651 次点击
所在节点    Python
10 条回复
wwwjfy
2016-06-26 22:30:05 +08:00
query 已经是一个 coroutine 了,直接在里面进行网络请求就行了啊, urllib 不是 asyncio ,干嘛要 await
response = urllib.xxx(xxx) 就行了

PS, tab 和空格混用是什么风格...
feather12315
2016-06-26 22:33:27 +08:00
`urllib`库不属于`future`类。应使用`aiohttp`,或从`socket`写
v2014
2016-06-26 22:36:05 +08:00
await 后面跟的也要是异步的函数
agnewee
2016-06-27 08:54:53 +08:00
@wwwjfy 额,排版问题,提交的时候没仔细看,抱歉。
如果不用 await ,那 async 也没什么意义吧。。。。
agnewee
2016-06-27 08:55:51 +08:00
@feather12315 这样啊,我早先考虑到可能是这个原因,但是没有深入想。感谢,我回头再好好研究研究。
agnewee
2016-06-27 08:56:57 +08:00
@v2014 也可以跟生成器对象和 awaitable 对象的吧
leavic
2016-06-27 09:50:23 +08:00
urllib 里的库还是传统的 blocking mode 函数,异步对它没有意义。
agnewee
2016-06-27 13:26:05 +08:00
@leavic 原来是这样。。。感谢。
wwwjfy
2016-06-27 17:57:36 +08:00
用 asyncio 跟 IO 相关的都得用它,除了原生,实际使用中没看到太大好处,不如用 gevent ~
控制确实更精细些,以后第三方库们成熟了可以考虑
SuperFashi
2016-06-27 18:45:55 +08:00
这意思就跟你不能用 time.sleep 只能用 asyncio.sleep 一样

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/288460

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX