Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Эксперт Pascal/Delphi
102 / 90 / 32
Регистрация: 30.05.2015
Сообщений: 589
1

Настроить декоратор на работу по дефолту (timeout=0)

24.01.2016, 19:19. Просмотров 1123. Ответов 3
Метки нет (Все метки)


есть декоратор:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
def timeoutf(timeout: int = 0):
    """
    decorator, execute function with timeout
    :param timeout: int, timeout in seconds, 0 - disable timeout
    :return: raise exception Timeout or result decorated function
    """
    def deco(func):
        # захотелось мне просто выполнить функцию если таймаут ее выполнения 0.... но увы...  !!!!!!!!
        if timeout == 0:
            return func()
        # подскажите как исправить !!!
 
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            res = [Exception('function [%s] timeout [%s seconds] exceeded!' % (func.__name__, timeout))]
 
            def new_func():
                try:
                    res[0] = func(*args, **kwargs)
                except Exception as e:
                    res[0] = e
 
            t = Thread(target=new_func)
            t.daemon = True
            try:
                t.start()
                t.join(timeout)
            except Exception as je:
                print('error starting thread')
                raise je
            ret = res[0]
            if isinstance(ret, BaseException):
                raise ret
            return ret
 
        return wrapper
 
    return deco
это для винды, пример использования:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def u():
    time.sleep(1)
 
    return 'dfgdfg'
    k = 1
    for ia in range(9999999):
        k = k * 2 + ia
    print(k)
 
 
if __name__ == '__main__':
    @timeoutf(0)
    def f():
        return u()
 
    print(f())
работает отлично, но вот по дефолту (тоесть таймаут 0) прикрутить не получается, прошу помочь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.01.2016, 19:19
Ответы с готовыми решениями:

Настроить phpstorm на работу с БД
может тема не там, если что перенесите. не могу настроить phpstorm на работу с удаленным сервером ...

Как настроить работу с COM
Подскажите, как сделать, чтобы можно было получить ссылку (GetObject) на класс в моём приложении. ...

Как настроить работу button
Как сделать, чтобы при нажатии на кнопку , происходила такая операция. Брались значения из TextBox...

Помогите настроить работу формы
Добрый день! Требуется помощь при работе со списками в форме. У меня есть простая форма,...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы Fullstack-разработчиков на Python
3
Эксперт по компьютерным сетям
4811 / 2709 / 833
Регистрация: 03.11.2009
Сообщений: 8,390
Записей в блоге: 3
24.01.2016, 20:51 2
что-то типа такого?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import time
 
 
def wait(parameter=0):
    def real_decor(function):
        def wrapper(*args, **kwargs):
            if not parameter:
                function(*args, *kwargs)
            else:
                time.sleep(parameter)
                print('\ndelayed {} seconds'.format(parameter))
                function(*args, *kwargs)
        return wrapper
    return real_decor
 
 
@wait(3) # будет ждать 3 секунды, прежде чем выполниться
def print_me1(x):
    print(x)
 
 
@wait() # выполнится сразу (сработает параметр = 0)
def print_me2(x):
    print(x)
 
 
 
print_me1("hello world - 1\n")
print_me2("hello world - 2\n")
0
Эксперт Pascal/Delphi
102 / 90 / 32
Регистрация: 30.05.2015
Сообщений: 589
24.01.2016, 21:32  [ТС] 3
спасибо но немного не то, декоратор должен ограничивать время выполнения функции по времени, взял отсюда:
http://stackoverflow.com/quest... in-windows
причесал немного чтобы под 3.5 питон шло, хочу прикрутить когда таймаут = 0, то декорируемая функция выполняется сколь угодно долго

К сожалению мои навики питона в области декораторов на уровне гугления покачто(
0
2723 / 2327 / 620
Регистрация: 19.03.2012
Сообщений: 8,832
25.01.2016, 16:52 4
Лучший ответ Сообщение было отмечено mmm_corp как решение

Решение

Решение для linux
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import time
import signal
import functools
 
 
class ExceededError(Exception):
    pass
 
 
def timeout(seconds=10):
    def decorator(func):
        def _handle_timeout(signum, frame):
            raise ExceededError('Превышено время ожидания')
 
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            signal.signal(signal.SIGALRM, _handle_timeout)
            signal.alarm(seconds)
            try:
                result = func(*args, **kwargs)
            finally:
                signal.alarm(0)
            return result
 
        if seconds == 0:
            return func
        else:
            return wrapper
 
    return decorator
 
 
@timeout(seconds=0)
def long_running_function():
    print('start')
    time.sleep(10)
    print('end')
 
try:
    long_running_function()
except ExceededError as error:
    print(error)
 
print('Продолжаем работу')
Кросс платформенное решение
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import time
import functools
import threading
 
 
class ExceededError(Exception):
    pass
 
 
def timeout(seconds):
    def decorator(func):
 
        def run_with_timeout(*args, **kwargs):
            def target():
                """
                Обертка для выполнения функции в отдельном потоке
                """
                try:
                    result.extend((func(*args, **kwargs), 'ok'))
                except Exception as error:
                    result.extend((error, 'error'))
 
            result = []
            worker = threading.Thread(target=target)
            worker.daemon = True
            try:
                worker.start()
                worker.join(seconds)
            except Exception as error:
                print('Error starting thread')
                raise error
 
            # Проверяем результат выполнения целевой функции
            if not result:
                message = (
                    'Функция "{}" выполнялась дольше,'.format(func.__name__) +
                    ' чем было разрешено "{}" сек.'.format(seconds)
                )
                raise ExceededError(message)
            else:
                if result[1] == 'error':
                    raise result[0]
 
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            if seconds == 0:
                return func(*args, **kwargs)
            else:
                run_with_timeout(*args, **kwargs)
 
        return wrapper
 
    return decorator
 
 
@timeout(0)
def long_running_function():
    print('start')
    time.sleep(5)
    print('end')
    return [0.1]
 
 
print(long_running_function())
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2016, 16:52

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Не получается настроить работу скрипта
На Денвере настраиваю работу скрипта, который должен рассылать в чаты сообщения. При его запуске...

Как настроить работу с формами
Доброго времени суток! Может кто подскажет где почитать как настраивать редактор форм в vs 2005....

Как настроить работу апача1.3.х с tomcat3.3.1?
Есть ли мануали как настроить работу апача1.3.х с tomcat3.3.1 на русском?Или может кто поделится...

Как настроить работу вентилятора процессора?
Здравствуйте, чтобы понизить шум от вентилятора проц. хочу настроить его работу в биосе BIOSTAR...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.