Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 9, 2017 10:38:17

UrfinJuice
Зарегистрирован: 2017-05-05
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание таймера для прерывания итерации в основном потоке

Добрый день!

Недавно начал изучать Пайтон, но уже есть задача, по которой необходима помощь.

Есть такая инструкция:

 import socket
def scan():
    for i in range(254):
        try:
            addr = "10.121.11.%d" % i
            f = socket.gethostbyaddr(addr)
            print(f)
        except:
            print('no name for', addr)

Проблема заключается в том, что функция gethostbyaddr() очень долго работает, когда не может получить ответ с именем хоста от DNS. Пробовал использовать параметр timeout - не помогает.
Появилась идея использовать таймер, чтобы при каждой итерации он запускался и, если значение таймера достигает определенного времени, функция прерывалась и переходила бы к следующей итерации. Затем я выяснил, что для такой реализации необходимо использование потоков. Но пока это совсем темный лес для меня. Для таймера хочу использовать threading.Timer().

1. Подскажите, пожалуйста, как можно реализовать решение задачи максимально просто и понятно. Совсем не могу понять как при достижении Timer-ом порогового значения сказать основному потоку прервать итерацию.
2. Есть ли какой-нибудь способ решить задачу без потоков?
3. Посоветуйте, пожалуйста, материалы по мультипотоковому программированию на понимание основ “для чайников”. Пока все книги, что находил, либо просто описывают функции модулей Thread и Threading либо на азах долго не останавливаются.

Заранее благодарен за любое содействие!

Офлайн

#2 Июнь 9, 2017 11:12:05

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

Создание таймера для прерывания итерации в основном потоке

0. Ну вот не с того вы начинаете ЯП учить..не с того. Раз нету базовых знаний куда вы в потоки лезете.
2. Асинхронность, asyncio



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

Офлайн

#3 Июнь 9, 2017 12:33:36

UrfinJuice
Зарегистрирован: 2017-05-05
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание таймера для прерывания итерации в основном потоке

JOHN_16
0. Ну вот не с того вы начинаете ЯП учить..не с того. Раз нету базовых знаний куда вы в потоки лезете.2. Асинхронность, asyncio
Да я в общем-то и не собирался пока лезть, пока тихонько почитываю Лутца, решаю простенькие задачи… А вот эта инструкция - производственная необходимость, которая очень нужна сейчас.
Про asyncio почитаю, спасибо.

Офлайн

#4 Июнь 9, 2017 15:03:22

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Создание таймера для прерывания итерации в основном потоке

Два запроса она посылает и выдаёт исключение socket.herror , если не может получить ответ.
Покажи весь код.



Отредактировано py.user.next (Июнь 9, 2017 15:04:05)

Офлайн

#5 Июнь 9, 2017 15:30:25

UrfinJuice
Зарегистрирован: 2017-05-05
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание таймера для прерывания итерации в основном потоке

py.user.next
Покажи весь код.
Функция scan() и есть весь код, работа которого меня интересует.
Все верно, выдает исключение, но длится это дело 4-5 секунд, тогда как если ответ есть, он приходит меньше чем за десятую долю секунды.
Для большой сети это критично. Поэтому и хочу сделать так, чтобы если ответа нет в течение 0.05 с, то break и т.д.

Офлайн

#6 Июнь 9, 2017 19:29:35

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Создание таймера для прерывания итерации в основном потоке

Офлайн

#7 Июнь 13, 2017 10:52:05

UrfinJuice
Зарегистрирован: 2017-05-05
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание таймера для прерывания итерации в основном потоке

vic57
gevent
Спасибо, разбираюсь.

Товарищ модератор, а за что удалили сообщение с “socket.setdefaulttimeout”? Это было неверное решение?

Офлайн

#8 Июнь 13, 2017 11:06:32

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

Создание таймера для прерывания итерации в основном потоке

Мы не удаляем просто так сообщения даже если оно не правильное. Видимо автор сам удалил



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

Офлайн

#9 Июнь 13, 2017 11:26:48

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Создание таймера для прерывания итерации в основном потоке

UrfinJuice
Товарищ модератор, а за что удалили сообщение с “socket.setdefaulttimeout”? Это было неверное решение?
Офлайн
я удалил - увидел пример с gevent как раз под твою задачу

Офлайн

#10 Июнь 14, 2017 17:00:54

UrfinJuice
Зарегистрирован: 2017-05-05
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание таймера для прерывания итерации в основном потоке

vic57
gevent
Товарищи, спасибо огромное, все получилось!

Сделал с gevent. Вышло даже быстрее, чем я планировал. Я хотел, чтобы каждая итерация прерывалась через определенное количество времени(но шли они друг за другом). А с gevent, если я правильно все понял, я запустил много микропотоков одновременно… Так даже быстрее, наверное.

В любом случае задача решена. Еще раз спасибо!

P.s. Подскажите, как вычислить сколько я могу запустить этих микропотоков, как узнать предел ресурса?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version