Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 27, 2016 17:25:14

Mr.Anderson
Зарегистрирован: 2015-02-06
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Прервать выполнение requests.get().text

Привет всем. Столкнулся с проблемой долгой загрузки сайта, с помощью requests.get().text
Суть вопроса, как прервать выполнение функции через како либо время?
Решение типа requests.get('link', timeout.text не помогает, функция все так же пытается получить код страницы.
Как можно решить данную проблему?

Офлайн

#2 Сен. 27, 2016 20:10:37

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Прервать выполнение requests.get().text

timeout “не работает” потому что:

Note
timeout is not a time limit on the entire response download; rather, an exception is raised if the server has not issued a response for timeout seconds (more precisely, if no bytes have been received on the underlying socket for timeout seconds). If no timeout is specified explicitly, requests do not time out.
ОС какая ?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Сен. 27, 2016 20:13:36

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Прервать выполнение requests.get().text

Вообще достаточно легко гуглится



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Сен. 27, 2016 20:17:26

Mr.Anderson
Зарегистрирован: 2015-02-06
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Прервать выполнение requests.get().text

JOHN_16
timeout “не работает” потому что:
Ос Linux, дебиан

Офлайн

#5 Сен. 27, 2016 22:10:51

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Прервать выполнение requests.get().text

Mr.Anderson
Это хорошо - посмотрите варианты по ссылке выше, там , на вскидку, не один вариант который вам подойдет



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Сен. 28, 2016 18:09:23

Mr.Anderson
Зарегистрирован: 2015-02-06
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Прервать выполнение requests.get().text

Взял от туда первое решение

 import signal
# Register an handler for the timeout
def handler(signum, frame):
     print("Forever is over!")
     raise Exception("end of time")
# This function *may* run for an indetermined time...
def loop_forever():
    html_codes = requests.get('https://books.google.ru/books?isbn=3659226408').text
# Register the signal function handler
signal.signal(signal.SIGALRM, handler)
# Define a timeout for your function
signal.alarm(3)
try:
     loop_forever()
except Exception:
     print('!')

Не помогло, все равно зависает

Офлайн

#7 Сен. 28, 2016 18:24:46

Mr.Anderson
Зарегистрирован: 2015-02-06
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Прервать выполнение requests.get().text

Вопрос закрыт, помогло это решение

 import multiprocessing.pool
import functools
def timeout(max_timeout):
    """Timeout decorator, parameter in seconds."""
    def timeout_decorator(item):
        """Wrap the original function."""
        @functools.wraps(item)
        def func_wrapper(*args, **kwargs):
            """Closure for function."""
            pool = multiprocessing.pool.ThreadPool(processes=1)
            async_result = pool.apply_async(item, args, kwargs)
            # raises a TimeoutError if execution exceeds max_timeout
            return async_result.get(max_timeout)
        return func_wrapper
    return timeout_decorator

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version