Python Asyncio не может работать - PullRequest
0 голосов
/ 25 мая 2018

Я хочу использовать 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)]

1 Ответ

0 голосов
/ 25 мая 2018

Попробуйте это:

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))
...