wait asyncio.wait(coroutines)无效语法

2024-04-20 11:40:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python程序,它使用asyncioawait模块。这是我从 here

import asyncio
import os
import urllib.request
import await

@asyncio.coroutine
def download_coroutine(url):
    """
    A coroutine to download the specified url
    """
    request = urllib.request.urlopen(url)
    filename = os.path.basename(url)

    with open(filename, 'wb') as file_handle:
        while True:
            chunk = request.read(1024)
            if not chunk:
                break
            file_handle.write(chunk)
    msg = 'Finished downloading {filename}'.format(filename=filename)
    return msg

@asyncio.coroutine
def main(urls):
    """
    Creates a group of coroutines and waits for them to finish
    """
    coroutines = [download_coroutine(url) for url in urls]
    completed, pending = await asyncio.wait(coroutines)
    for item in completed:
        print(item.result())


if __name__ == '__main__':
    urls = ["http://www.irs.gov/pub/irs-pdf/f1040.pdf",
            "http://www.irs.gov/pub/irs-pdf/f1040a.pdf",
            "http://www.irs.gov/pub/irs-pdf/f1040ez.pdf",
            "http://www.irs.gov/pub/irs-pdf/f1040es.pdf",
            "http://www.irs.gov/pub/irs-pdf/f1040sb.pdf"]

    event_loop = asyncio.get_event_loop()
    try:
        event_loop.run_until_complete(main(urls))
    finally:
        event_loop.close()

我正在使用python 3.5.1

C:\Anaconda3\python.exe "C:\Users\XXXXXXS\AppData\Roaming\JetBrains\PyCharm Community Edition 2016.1\helpers\pydev\pydevconsole.py" 49950 49951
Python 3.5.1 |Anaconda 2.4.0 (64-bit)| (default, Jun 15 2016, 15:29:36) [MSC v.1900 64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.

当我试图运行它时,我得到了以下错误。

  File "C:/Cubic/playpen/python/concepts/advanced/coroutines.py", line 29
    completed, pending = await asyncio.wait(coroutines)
                                     ^
SyntaxError: invalid syntax

我已经安装了asyncio和await。

我也试过同样的方法,也没有发现语法错误。

C:\playpen\python>python
Python 3.5.1 |Anaconda 2.4.0 (64-bit)| (default, Jun 15 2016, 15:29:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> async def foo():
...   await bar
...

Tags: importasynciohttpurlforpdfrequestwww
3条回答

你有两个不同的问题。

  1. 正如dirn在他的注释中提到的,您不应该导入awaitawait是Python 3.5中的内置关键字。所以,删除import await

  2. 您混合了@asyncio.coroutinedecorator和await关键字(正如2Cubed所提到的)。使用async def而不是decorator,如链接到的example中所示。换句话说,而不是:

@asyncio.coroutine
def download_coroutine(url):

使用:

async def download_coroutine(url):

main执行同样的操作。

如果您做了这些更改,您的代码应该在Python3.5下运行。

你的文章说:

The async and await keywords were added in Python 3.5 to define a native coroutine and make them a distinct type when compared with a generator based coroutine. If you’d like an in-depth description of async and await, you will want to check out PEP 492.

这意味着这些KW在Python3.4中无效。

我现在安装了python 3.5并尝试了python解释器

foo@foo-host:~$ python3.5  
Python 3.5.0+ (default, Oct 11 2015, 09:05:38)  
[GCC 5.2.1 20151010] on linux  
Type "help", "copyright", "credits" or "license" for more information.  
>>> async def foo():  
...     await bar  
...   
>>>   

没有语法错误。

当在使用async关键字定义的函数内部以外的任何地方使用时,await将引发一个SyntaxError,而不管它是否已使用@asyncio.coroutine装饰器进行协程。

import asyncio

async def test():
    pass


async def foo():
    await test()  # No exception raised.

@asyncio.coroutine
def bar():
    await test()  # Exception raised.

相关问题 更多 >