Пакет сигналов Python не может функционировать по тайм-ауту? - PullRequest
0 голосов
/ 09 января 2019

Итак, у меня есть скрипт на Python, который будет производить выборку с поверхностей трехмерного объекта, чтобы получить представление объекта в облаке точек.

У меня около 85 000 файлов данных, и некоторые из них на самом деле являются двумерными объектами и приведут к тому, что функция, выполняющая преобразование, будет работать вечно. Я планирую следовать этому подходу , использовать функцию signal.alarm() и try except, чтобы пропустить дела, которые выполняются слишком долго (более 5 секунд).

Однако следующий код не работает. Функция все еще застревает на проблемных файлах ...

Если у вас есть минутка, не могли бы вы помочь определить возможные причины? Я неправильно использую функцию signal.alarm()? Спасибо!

Я на машине с Linux Ubuntu 16.04

Проблемный код произошел в блоке try except в функции main, которая является вызовом функции P = tri2pts(V, G, 2048). Копирование оставшегося кода только для согласованности.

import numpy as np
import pyximport; pyximport.install(inplace=True, reload_support=True)
from _trimesh2pointcloud import cy_trimesh2pointcloud as tri2pts
import signal


def handler(signum, frame):
    print("Forever is over!")
    raise Exception("end of time")


def strip_slash(str1):
    slash_pos = str1.find('/')
    if slash_pos > -1:
        return int(str1[0:slash_pos])
    else:
        return int(str1)

def read_obj(fname):
    with open(fname) as f:
        content = f.readlines()

    content = [x.strip('\n') for x in content]
    content = [x.split() for x in content]

    type_col = np.array([row[0] for row in content])
    v_ind = np.where(type_col == 'v')[0]
    f_ind = np.where(type_col == 'f')[0]

    content = [x[1:4] for x in content]
    content = np.array(content)
    vertices = content[v_ind].tolist()
    faces = content[f_ind].tolist()

    vertices = np.array([[float(y) for y in x] for x in vertices])
    faces = np.array([[strip_slash(y) - 1 for y in x] for x in faces])
    return vertices, faces


def main():
    base_dir = '/media/yuqiong/DATA/problems'
    flist = os.listdir(base_dir)

    for f in flist:
        V, G = read_obj(os.path.join(base_dir, f))
        print("Now process file ")
        print(f)
        signal.signal(signal.SIGALRM, handler)
        signal.alarm(5)
        try:
            P = tri2pts(V, G, 2048)
        except Exception as exc:
            print(exc)
            continue

if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...