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

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

22.12.2016, 20:01. Показов 3499. Ответов 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
 Аватар для Рыжий Лис
5972 / 3734 / 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
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru