Python异步IO无法工作
我想使用asyncio获得一组图像的大小 通过传入一组URL,我希望得到三个值,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
(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块。如果不能执行这些操作,至少可以在错误级别记录异常,以便在异常发生时仍保留异常信息。