Как завершить функцию в течение указанного времени - PullRequest
0 голосов
/ 26 января 2019

У меня есть функция, которая определяет, является ли изображение аватаром или нет. Мне нужно завершить вызванную функцию, как только время выполнения превысит 5 секунд.

#!/usr/bin/python
from PIL import Image
from urllib.request import urlopen


def avatar_detect(image_url):
    img = Image.open(urlopen(image_url))
    total = 0
    pixels = img.convert('RGBA').load()
    width, height = img.size
    colours = list()
    for x in range(width):
        for y in range(height):
            r, g, b, _ = pixels[x, y]
            hex_ = '#{:02x}{:02x}{:02x}'.format(r, g, b)
            colours.append(hex_)
            total += 1
        total += 1
    highest = colours.count(max(set(colours), key=colours.count))
    return True if highest / total > 0.5 else False


# https://peopledotcom.files.wordpress.com/2018/10/the-weeknd-1.jpg
# -> should be terminated after 5 seconds

# https://avatars2.githubusercontent.com/u/8427649?s=64&v=4
# -> fast execution less than 5 seconds

url = 'https://avatars2.githubusercontent.com/u/8427649?s=64&v=4'
print(avatar_detect(url))

1 Ответ

0 голосов
/ 26 января 2019

Вы можете создать процесс и завершить его, если он жив после ожидания в течение 5 секунд.Следующий код может войти в основную функцию:

p = Process(target = avatar_detect, args = ('image_url',))
p.start()    
p.join(5)    
if p.is_alive():
    print('Time-out occurred')
    p.terminate()
    p.join()

И не забудьте импортировать Process:

from multiprocessing import Process
...