Size: a a a

2021 February 18

IB

Ivan Belokobylskiy in SPb Python
Но почему-то не всегда внешний t.result() ловит исклчения и потому задачи со временем (через полдня-день) умирают и всё, потому что исключения ловятся не в родительской задаче, а в глобальном обработчике исключений.
источник

IB

Ivan Belokobylskiy in SPb Python
Подозреваю, что эта функция работает криво. Можете помочь осознать, где ошибка?
источник

p

pragus in SPb Python
Ivan Belokobylskiy
Я придумал такую обёртку:

async def run_tasks_and_cancel_on_first_return(*tasks: ty.Set[aio.Future],
                                              return_when=aio.FIRST_COMPLETED,
                                              ) -> ty.Set[aio.Future]:
   try:
       done, pending = await aio.wait(tasks, return_when=return_when)
   except aio.CancelledError:
       for t in tasks:
           if isinstance(t, aio.Task) and not t.done():
               t.cancel()
               try:
                   await t
               except aio.CancelledError:
                   pass
       raise

   for t in pending:
       if isinstance(t, aio.Task):
           t.cancel()
   for t in pending:
       if isinstance(t, aio.Task):
           try:
               await t
           except aio.CancelledError:
               pass
   return done
а можно код куда-то на pastebin?
источник

IB

Ivan Belokobylskiy in SPb Python
Код этой функции?
источник

A

Alexander in SPb Python
Маша Чакчурина
Всем привет! А может ли кто-нибудь рекомендовать книгу, как писать чистый код, но на Пайтон? Как чистый код Мартина

Запрос от друга (мопед не мой), я предложила несколько книг, но там нужны именно про пайтон
Если не читал совершенный код, то я настоятельно рекомендую эту книгу. После её прочтения человек точно станет чуточку лучше писать свой код
источник

p

pragus in SPb Python
Ivan Belokobylskiy
Код этой функции?
В  идеале, минимальный пример проблемы
источник

IB

Ivan Belokobylskiy in SPb Python
К сожалению, я не могу его собрать, т.к. ошибка случается нечасто и обычно из-за аппаратных исключений.

https://pastebin.com/HJbgN7M5

Немного псевдокода как я использую эту функцию
источник

A

Alexander in SPb Python
Ivan Belokobylskiy
Всем привет! Пишу приложение на asyncio, работает с блютус устройствами. Приложение устроено так, что на каждое устройство запускается своя asyncio.Task. Каждая задача ещё может запускать несколько подзадач. Мне надо, чтобы если одна из пачки работающих задач вылетала с исключением, то задача уровнем выше отменяла другие задачи из пачки и запускала эту пачку по-новой.
что-то мне подсказывает, что тут отлично подойдёт gather
источник

IB

Ivan Belokobylskiy in SPb Python
Ощущение, что в каких-то случаях задачи не отменяются, продолжают работать и когда у них возникает исключение, оно ловится в глобальном обработчике исключений
источник

A

Alexander in SPb Python
If gather() is cancelled, all submitted awaitables (that have not completed yet) are also cancelled.

https://docs.python.org/3/library/asyncio-task.html#running-tasks-concurrently
источник

A

Alexander in SPb Python
ловишь исключение, канселяешь задачу с gather. Все нижележащие таски кансельнутся сами
источник

IB

Ivan Belokobylskiy in SPb Python
А ты мог бы пример на псевдокоде какой-нибудь написать? Я не понимаю, как мне отменять соседние задачи с той, где возникло исключение
источник

A

Alexander in SPb Python
ну что-то типа такого:
def gathered_here(tasks):
   try:
        foo = await asyncio.gather(*tasks)
   except Exception as e:
         try:
               foo.cancel()
         except Exception: .....
источник

A

Alexander in SPb Python
вообще, я бы сделал класс с awaitable методами. То, как у тебя код оформлен, ломает глаза
источник

IB

Ivan Belokobylskiy in SPb Python
А тут можно понять, какая задача вылетела с исключением?
источник

A

Alexander in SPb Python
смотря какой питон
источник

A

Alexander in SPb Python
в 3.8 вроде как завезли поле name для тасок
источник

IB

Ivan Belokobylskiy in SPb Python
3.7
источник

IB

Ivan Belokobylskiy in SPb Python
Ок, спасибо, попробую такой вариант. Правда, не видно, что тут концептуально изменилось.
источник

A

Alexander in SPb Python
попробуй поэкспериментировать. Я вот так сходу рабочий вариант не накидаю. Но сам бы я смотрел в сторону gather и начал бы с тестов с ним
источник