Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
 Аватар для Zuzik
298 / 256 / 57
Регистрация: 11.06.2012
Сообщений: 1,557

Asyncio корректное завершение в случае непредвиденной остановки программы

22.12.2016, 20:01. Показов 3610. Ответов 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
@asyncio.coroutine
def do_work(data):
    for adres, ip_list in data.items():
        if len(ip_list) >3:
            tasks = []
            for ip in ip_list:
                task = asyncio.async(walk_to_ip(ip))
                tasks.append(task)
            responses = yield from asyncio.gather(*tasks)
            res = set([bool(x) for x in responses])
 
            if len(res) == 1 and res == set([False]):
                print(adres, 'Bad',len(ip_list) )
            else:
                print(adres, 'OK' )
 
if __name__ == '__main__':
    data = get_data()
    try:
 
        loop = asyncio.get_event_loop()
        loop.run_until_complete(do_work(data))
        
    except Exception as e:
        print(e)
    finally:
        loop.close()
Допусти я его запускаю из консоли.
В случае если я прерву его выполнение, то падает ошибка следующего вида -
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Traceback (most recent call last):
  File "total_monitor.py", line 108, in <module>
    loop.run_until_complete(do_work(data))
  File "/usr/lib/python3.4/asyncio/base_events.py", line 304, in run_until_complete
    self.run_forever()
  File "/usr/lib/python3.4/asyncio/base_events.py", line 276, in run_forever
    self._run_once()
  File "/usr/lib/python3.4/asyncio/base_events.py", line 1136, in _run_once
    event_list = self._selector.select(timeout)
  File "/usr/lib/python3.4/selectors.py", line 432, in select
    fd_event_list = self._epoll.poll(timeout, max_ev)
KeyboardInterrupt
Exception ignored in: Exception ignored in: Exception ignored in: Exception ignored in: Task was destroyed but it is pending!
task: <Task pending coro=<walk_to_ip() running at total_monitor.py:74> wait_for=<_GatheringFuture pending cb=[Task._wakeup()]> cb=[gather.<locals>._done_callback(5)() at /usr/lib/python3.4/asyncio/tasks.py:587]>
Task was destroyed but it is pending!
task: <Task pending coro=<walk_to_ip() running at total_monitor.py:74> wait_for=<_GatheringFuture pending cb=[Task._wakeup()]> cb=[gather.<locals>._done_callback(4)() at /usr/lib/python3.4/asyncio/tasks.py:587]>
Как я понимаю, это все по причине того, что нужно еще каким то образом обработать исключение внутри функции do_work, которое бы ожидало пока завершаться уже запущенные корутины. Возникает вопрос: как?

Добавлено через 17 минут
гугл и стековерфлоу подсказали примерно такой вариант, но он ситуации не улучшил.
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
@asyncio.coroutine
def do_work(data):
    for adres, ip_list in data.items():
        if len(ip_list) >3:
            tasks = []
            for ip in ip_list:
                task = asyncio.async(walk_to_ip(ip))
                tasks.append(task)
            responses = yield from asyncio.gather(*tasks)
            res = set([bool(x) for x in responses])
 
            if len(res) == 1 and res == set([False]):
                print(adres, 'Bad',len(ip_list) )
            else:
                print(adres, 'OK' )
 
if __name__ == '__main__':
    data = get_data()
    loop = asyncio.get_event_loop()
    try:        
        loop.run_until_complete(do_work(data))
        
    except Exception as e:
        loop.stop()
        pending = asyncio.Task.all_tasks()
        loop.run_until_complete(asyncio.gather(*pending))
        logger.debug('error - {}'.format(e))
    finally:
        loop.stop()
    loop.close()
П.С. Python 3.4.3, ubuntu 14.04
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.12.2016, 20:01
Ответы с готовыми решениями:

Запуск службы и её перезапуск в случае непредвиденной остановки
Всем привет. Столкнулся с проблемой - нужно сделать скрипт, который запускает определённую службу, при чём если служба остановлена, или...

Корректное завершение программы, вместе с окном
Закрываю окно через крксик, и оно закрывается но процесс остаётся звуки остаются даже управление остаётся поскольку использую независимую...

Как сделать корректное завершение программы при выключении Windows?
Если при запущенном приложении пользователь винды нажмет &quot;Завершение работы&quot;, это закроет вашу программу без обработки OnClose,...

3
Заблокирован
23.12.2016, 07:45
А питон заверщает свое выполнение(+метод __del__ отрабатывает)? Если да, то в чем собственно проблема(вы прервали выполнение, питон и выключился...)
0
4 / 4 / 1
Регистрация: 10.11.2015
Сообщений: 13
06.09.2017, 12:36
loop.run_until_complete(asyncio.gather(* pending, return_exceptions=True))
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
07.09.2017, 04:42
Python
1
2
3
4
5
6
7
8
9
import sys
 
_old_excepthook = sys.excepthook
def myexcepthook(exctype, value, traceback):
    if exctype == KeyboardInterrupt:
        pass  #...
    else:
        _old_excepthook(exctype, value, traceback)
sys.excepthook = myexcepthook
Перехватили исключение, а дальше я не знаю... Может есть способ убить потоки?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.09.2017, 04:42
Помогаю со студенческими работами здесь

Корректное завершение
Когда закрываю окно QGraphicsView`а, процесс остается еще запущен и пишет еще что возникла ошибка. Как корректно завершить работу? int...

Корректное завершение
Здравствуйте. Есть класс-одиночка (шаблон такой). При завершении работы в нем обязательно нужно вызвать функцию очистки. Важно, чтобы...

Корректное завершение Excel
Коллеги, подскажите, как же мне корректно завершить &quot;висящий&quot; процесс MS Excel после обработки файла? Пробовал различными методами. Таким...

Корректное завершение QCoreApplication
Добрый день! OC: Windows 7 Professional Qt: 5.7.0 Есть приложение QCoreApplication: int main(int argc, char *argv) { ...

Корректное завершение потока
Добрый день. Пишу программу с использованием pyqt5, всего навсего кликает по заранее введённым координатам и выполняет ещё ряд функций. По...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru