Python异步IO无法工作

Python异步IO无法工作,python,python-asyncio,Python,Python Asyncio,我想使用asyncio获得一组图像的大小 通过传入一组URL,我希望得到三个值,(x,y,channel) 然而,我什么也得不到 我的代码有什么问题吗 from PIL import Image from io import BytesIO import numpy as np import asyncio import concurrent.futures import requests def get_image_shape(path): try: img = Im

我想使用asyncio获得一组图像的大小

通过传入一组URL,我希望得到三个值,
(x,y,channel)

然而,我什么也得不到

我的代码有什么问题吗

from PIL import Image
from io import BytesIO
import numpy as np
import asyncio
import concurrent.futures
import requests

def get_image_shape(path):
    try:
        img = Image.open(BytesIO(requests.get(path).content))
        arr = np.array(img, dtype = np.uint8)
        return arr.shape
    except:
        return (0,0,0)

async def main(url_list):
    loop = asyncio.get_event_loop()
    futures = [
        loop.run_in_executor(
            None, 
            get_image_shape, 
            url
        )
        for url in url_list]
    for response in await asyncio.gather(*futures):
        pass

loop = asyncio.get_event_loop()
loop.run_until_complete(main(url_list))

#response.result()
#[(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)]
试试这个:

from PIL import Image
from io import BytesIO
import numpy as np
import asyncio
import concurrent.futures
import requests

def get_image_shape(path):
    try:
        img = Image.open(BytesIO(requests.get(path).content))
        arr = np.array(img, dtype = np.uint8)
        return arr.shape
    except:
        return (0,0,0)

async def main(url_list):
    loop = asyncio.get_event_loop()
    futures = [
        loop.run_in_executor(
            None, 
            get_image_shape, 
            url
        )
        for url in url_list]
    return [response for response in await asyncio.gather(*futures)]

loop = asyncio.get_event_loop()
response = loop.run_until_complete(main(url_list))
试试这个:

from PIL import Image
from io import BytesIO
import numpy as np
import asyncio
import concurrent.futures
import requests

def get_image_shape(path):
    try:
        img = Image.open(BytesIO(requests.get(path).content))
        arr = np.array(img, dtype = np.uint8)
        return arr.shape
    except:
        return (0,0,0)

async def main(url_list):
    loop = asyncio.get_event_loop()
    futures = [
        loop.run_in_executor(
            None, 
            get_image_shape, 
            url
        )
        for url in url_list]
    return [response for response in await asyncio.gather(*futures)]

loop = asyncio.get_event_loop()
response = loop.run_until_complete(main(url_list))


也许你不应该让引发的异常保持沉默。那么我应该更改什么?删除try/except,这样你就可以看到发生了什么-像这样全面抑制异常是非常糟糕的方式,因为它可以隐藏大量错误,就像它为你做的那样。谢谢,barny.也许你不应该让引发的异常保持沉默。那么我应该改变什么呢?删除try/except,这样你就可以看到发生了什么-像这样对异常进行全面抑制是一种非常糟糕的方式,因为它可以隐藏大量错误,就像对你所做的那样。谢谢,巴尼。请考虑删除毯子尝试/除了从答案中的代码。这是一个Python反模式,避免广告是个好主意。如果从代码中删除覆盖try/except,我们应该如何处理异常?@Mike您可以让异常传播到调用方,这样它们也会被中断,而不是继续使用一些虚假的值。或者,如果您希望某个特定操作失败(例如,文件丢失),则捕获该异常,例如
IOError
。用
捕获任何和所有异常,除了:
几乎从来都不是您想要的。当我们无法确定发生了什么类型的异常时,尝试捕获所有异常将是安全的。捕获所有异常并抑制它们是非常危险的,在try块中发生的任何意外异常也将被抑制,并使查找新错误变得困难。如果您发现了特定的异常,您希望它能够限制这种风险。此外,try块中有多个操作,如果只期望其中一个操作出现异常,则仅将其保留在try中,并将其余操作移动到previous或else块。如果你不能做这些事情,你至少可以在错误级别记录异常,这样在发生时你仍然有异常信息。请考虑删除毯子尝试/从答案中的代码中删除。这是一个Python反模式,避免广告是个好主意。如果从代码中删除覆盖try/except,我们应该如何处理异常?@Mike您可以让异常传播到调用方,这样它们也会被中断,而不是继续使用一些虚假的值。或者,如果您希望某个特定操作失败(例如,文件丢失),则捕获该异常,例如
IOError
。用
捕获任何和所有异常,除了:
几乎从来都不是您想要的。当我们无法确定发生了什么类型的异常时,尝试捕获所有异常将是安全的。捕获所有异常并抑制它们是非常危险的,在try块中发生的任何意外异常也将被抑制,并使查找新错误变得困难。如果您发现了特定的异常,您希望它能够限制这种风险。此外,try块中有多个操作,如果只期望其中一个操作出现异常,则仅将其保留在try中,并将其余操作移动到previous或else块。如果不能执行这些操作,至少可以在错误级别记录异常,以便在异常发生时仍保留异常信息。