У меня есть клиентский и серверный модуль, каждый из которых может быть запущен функцией. Мне просто нужно найти способ запустить стенд параллельно, которые:Как использовать потоки для функциональных тестов приложения клиентского сервера?
в случае исключения в клиент/сервер остановится другой, так что тест бегун бы не остаться застрял
в случае за исключения в архитектуре клиент/сервер будет печатать исключение или распространить его на бегуна, чтобы я мог видеть это и отладки клиент/сервер с помощью тестового набора
бы предпочтительно использовать темы для повышения производительности
Первое предварительный с простыми нитями закончились уродливой os._exit(1)
при ловле исключения в методе выполнения резьбы (который убивает тест бегун ...) Edit: с заправочным пакетом
Вторыми предварительным (до старайтесь избегать os._exit()) с concurrent.futures.ThreadPoolExecutor
. Это позволяет исключить исключение из потока, но я все еще не могу найти способ прервать другой поток.
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
server_future = executor.submit(server)
client_future = executor.submit(client)
concurrent.futures.wait([server_future, client_future],
return_when=concurrent.futures.FIRST_EXCEPTION)
if client_future.done() && client_future.exception():
# we can handle the client exception here
# but how to stop the server from waiting the client?
# also, raise is blocking
if server_future.done() && server_future.exception():
# same here
- Есть ли способ для достижения этой цели с потоками?
- Если нет в потоках, есть ли простой способ протестировать приложение клиентского сервера? (Я думаю, что двух первых требований достаточно, чтобы иметь пригодное для использования решение)
Редактировать: клиент или сервер будут заблокированы при вызове accept() или receive(), поэтому я не могу периодически путать flag a решите выйти. (один из классических способов остановить поток)
Первая попытка была с пакетом с резьбой, я должен был упомянуть об этом. Я искал, как убить поток, но не смог применить решение, потому что я не контролировал то, что делает нити (не может периодически проверять флаг). В моем случае они блокировали бы выполнение accept() или receive() в сокете. Но после того, как я выяснил, как прервать эти операции, я узнал, что могу просто закрыть() сокет! Большое спасибо за косвенное руководство меня к этому решению! – tuxayo