Size: a a a

2021 June 09

DS

David Shiko in SPb Python
Даже если так, как мне while loop прервать без бесконечных if проверок?
источник

SK

Sergio Keler in SPb Python
tcp закрой. соединений порви. етить...
источник

SK

Sergio Keler in SPb Python
генери исключение.
лови его.
в обработчике прибивай что там надо.
источник

DS

David Shiko in SPb Python
А нельзя просто 2 event loop создать, 1 на прослушивание команд (новых данных), а другой на исполнение?
Так ведь все окна во всех ОС устроены насколько я знаю. 1 поток контролирует команды на закрытие/сворачивание окна, другой за исполнение.
источник

SK

Sergio Keler in SPb Python
зачем?
по await у тебя управление переходит в евентлуп.
там по очереди оно переходит к другим функциям. если какая-то обнаружила проблему, ну... пусть жахнет соединение и всё. соответствующая функция для этого соединения вылетит с исключение "ааа, тут проблема с конектом".
источник

DS

David Shiko in SPb Python
Так она не сама обнаруживает, ей нужно сообщить, что "твои вычисления уже неактуальны, убейся"
источник

DS

David Shiko in SPb Python
ИЛи самому это сделать, не важно
источник

SK

Sergio Keler in SPb Python
Ну, кто-то же обнаруживает? Вот кто обнаруживает, тот и рвёт связь.
источник

A

Alexander in SPb Python
Надо смотреть, умеет ли сам драйвер прибивать запрос посреди пути. Скорее всего, что может если драйвер на голом питоне.
Породи корутину с запросом в бд и прибей её когда нужно будет
источник

DS

David Shiko in SPb Python
Воот, это то, что я ищу. А можно чуть подробнее, мб ссылки есть, как породить корутину и как ее прибить?
источник

A

Alexander in SPb Python
источник

A

Alexander in SPb Python
будет что-то типа такого:
task = asyncio.create_task(<твоя корутина>)
...
task.cancel()
источник

A

Alexander in SPb Python
корутина - должен быть awaitable объект
источник

A

Alexander in SPb Python
на сам task await'титься не надо, т.к. это просто ссылка на объект, который уже прокручивается в цикле событий
источник

A

Alexander in SPb Python
хотя нет, вру здесь.
Этот момент надо проверять.
Я обычно порождаю таски через asyncio.create_task для того, чтобы они сами по себе там крутились, я не присваиваю результат работы этой функции какой-либо переменной.
Если делать так:
task = asyncio.create_task
то сама переменная task - это вроде как корутина и на неё тоже надо вызывать await.
Короче, этот момент проверь сам уже.
источник

DS

David Shiko in SPb Python
Правильно понял за исключением того, что возвращает task?

async def db_query(date):
   pass


@router.websocket(path="")
async def websocket_endpoint(
       websocket: WebSocket,
       postgres_session=Depends(database.get_db),
):
   try:
       await ws_manager.connect(websocket)
       while True:
           data = await websocket.receive_text()
           try:  #  If task not exists still
               task.cancel()
           except Exception as e:
               pass
           task = asyncio.create_task(await db_query(data))
           result = await asyncio.gather(*[task])
           return await websocket.send_text(result)
   except WebSocketDisconnect:
       ws_manager.disconnect(websocket)
источник

A

Alexander in SPb Python
gather здесь лишним выглядит
источник

A

Alexander in SPb Python
попробуй просто
task = asyncio.create_task(await db_query(data))
           result = await task
источник

DS

David Shiko in SPb Python
Это просто единственный способ который я знаю как получить результат))
источник

YV

Yuliya Volkova in SPb Python
дополню Сашу - gather только если у тебя больше чем 1 таска и тебе надо от всех от них дождаться пачкой результат
источник