Как распространить исключения, создаваемые сервером сокетов, работающим в задаче группы задач, на родительскую группу задач? В данном примере я ожидаю, что ошибка, возникшая из процесса_client_command(), будет перехвачена блоком исключений в run_server(), но вместо этого сервер продолжает работать, а «Необработанное исключение» выходит из системы.
Сервер первого запуска:
$ ./script.py server
DEBUG:asyncio:Using selector: EpollSelector
# following is printed upon receiving data from client:
DEBUG:__main__:received task from client from client, raising exception...
ERROR:asyncio:Unhandled exception in client_connected_cb
transport:
Traceback (most recent call last):
File "/tmp/script.py", line 19, in process_client_command
raise RuntimeError("error processing client command")
RuntimeError: error processing client command
И из другого клиента, запускаемого через терминал:
$ ./script.py client
Сам пример:
#!/usr/bin/env python3
import asyncio
import sys
import logging
from logging import Logger
LOGGER: Logger = logging.getLogger(__name__)
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
SOCK_PATH = "/tmp/test.sock"
async def process_client_commands() -> None:
async def process_client_command(reader, writer):
data = (await reader.read()).decode()
LOGGER.debug(f"received task {data} from client, raising exception...")
raise RuntimeError("error processing client command")
server = await asyncio.start_unix_server(
process_client_command, SOCK_PATH
)
await server.serve_forever()
async def run_server() -> None:
try:
async with asyncio.TaskGroup() as tg:
tg.create_task(process_client_commands())
except* Exception as exc_group:
LOGGER.debug(f"{len(exc_group.exceptions)} errs caught in exc group")
sys.exit(1)
async def _open_write_socket(msg: str):
try:
_, writer = await asyncio.open_unix_connection(SOCK_PATH)
except FileNotFoundError:
LOGGER.error("server is not running")
sys.exit(1)
LOGGER.debug(f"sending message {msg}")
writer.write(msg.encode())
await writer.drain()
writer.write_eof()
return writer
async def send_msg(msg: str):
writer = await _open_write_socket(msg)
LOGGER.debug("closing the connection")
writer.close()
await writer.wait_closed()
if len(sys.argv)
Подробнее здесь: https://stackoverflow.com/questions/798 ... theyre-sta
Как заставить сервер сокетов распространять исключения до TaskGroup, откуда они запускаются? ⇐ Python
Программы на Python
1763646648
Anonymous
Как распространить исключения, создаваемые сервером сокетов, работающим в задаче группы задач, на родительскую группу задач? В данном примере я ожидаю, что ошибка, возникшая из процесса_client_command(), будет перехвачена блоком исключений в run_server(), но вместо этого сервер продолжает работать, а «Необработанное исключение» выходит из системы.
Сервер первого запуска:
$ ./script.py server
DEBUG:asyncio:Using selector: EpollSelector
# following is printed upon receiving data from client:
DEBUG:__main__:received task from client from client, raising exception...
ERROR:asyncio:Unhandled exception in client_connected_cb
transport:
Traceback (most recent call last):
File "/tmp/script.py", line 19, in process_client_command
raise RuntimeError("error processing client command")
RuntimeError: error processing client command
И из другого клиента, запускаемого через терминал:
$ ./script.py client
Сам пример:
#!/usr/bin/env python3
import asyncio
import sys
import logging
from logging import Logger
LOGGER: Logger = logging.getLogger(__name__)
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
SOCK_PATH = "/tmp/test.sock"
async def process_client_commands() -> None:
async def process_client_command(reader, writer):
data = (await reader.read()).decode()
LOGGER.debug(f"received task {data} from client, raising exception...")
raise RuntimeError("error processing client command")
server = await asyncio.start_unix_server(
process_client_command, SOCK_PATH
)
await server.serve_forever()
async def run_server() -> None:
try:
async with asyncio.TaskGroup() as tg:
tg.create_task(process_client_commands())
except* Exception as exc_group:
LOGGER.debug(f"{len(exc_group.exceptions)} errs caught in exc group")
sys.exit(1)
async def _open_write_socket(msg: str):
try:
_, writer = await asyncio.open_unix_connection(SOCK_PATH)
except FileNotFoundError:
LOGGER.error("server is not running")
sys.exit(1)
LOGGER.debug(f"sending message {msg}")
writer.write(msg.encode())
await writer.drain()
writer.write_eof()
return writer
async def send_msg(msg: str):
writer = await _open_write_socket(msg)
LOGGER.debug("closing the connection")
writer.close()
await writer.wait_closed()
if len(sys.argv)
Подробнее здесь: [url]https://stackoverflow.com/questions/79824570/how-to-make-socket-server-propagate-exceptions-up-to-taskgroup-where-theyre-sta[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия