V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
agnewee
V2EX  ›  Python

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

  •  
  •   agnewee · 2016-06-26 22:07:42 +08:00 · 4562 次点击
    这是一个创建于 2857 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    PS, tab 和空格混用是什么风格...
    feather12315
        2
    feather12315  
       2016-06-26 22:33:27 +08:00 via Android
    `urllib`库不属于`future`类。应使用`aiohttp`,或从`socket`写
    v2014
        3
    v2014  
       2016-06-26 22:36:05 +08:00
    await 后面跟的也要是异步的函数
    agnewee
        4
    agnewee  
    OP
       2016-06-27 08:54:53 +08:00
    @wwwjfy 额,排版问题,提交的时候没仔细看,抱歉。
    如果不用 await ,那 async 也没什么意义吧。。。。
    agnewee
        5
    agnewee  
    OP
       2016-06-27 08:55:51 +08:00
    @feather12315 这样啊,我早先考虑到可能是这个原因,但是没有深入想。感谢,我回头再好好研究研究。
    agnewee
        6
    agnewee  
    OP
       2016-06-27 08:56:57 +08:00
    @v2014 也可以跟生成器对象和 awaitable 对象的吧
    leavic
        7
    leavic  
       2016-06-27 09:50:23 +08:00
    urllib 里的库还是传统的 blocking mode 函数,异步对它没有意义。
    agnewee
        8
    agnewee  
    OP
       2016-06-27 13:26:05 +08:00
    @leavic 原来是这样。。。感谢。
    wwwjfy
        9
    wwwjfy  
       2016-06-27 17:57:36 +08:00
    用 asyncio 跟 IO 相关的都得用它,除了原生,实际使用中没看到太大好处,不如用 gevent ~
    控制确实更精细些,以后第三方库们成熟了可以考虑
    SuperFashi
        10
    SuperFashi  
       2016-06-27 18:45:55 +08:00 via Android
    这意思就跟你不能用 time.sleep 只能用 asyncio.sleep 一样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3406 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 11:20 · PVG 19:20 · LAX 04:20 · JFK 07:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.