【发布时间】:2022-01-24 21:28:09
【问题描述】:
为了测试中间人 tcp 代理,我编写了一个 echo tcp 服务器和一个 tcp 客户端。在每次测试之后,我希望代理和服务器关闭,以确保每次测试都在干净的环境中开始,所以我编写了代码:
class TestConnections(TestCase):
loop = None
@classmethod
def setUpClass(cls) -> None:
TestConnections.loop = asyncio.new_event_loop()
asyncio.set_event_loop(TestConnections.loop)
def setUp(self) -> None:
EnergyAgent.GP = GrowattParser.GrowattParser()
self.server = self.loop.create_task(tcp_server(1235))
self.gp = self.loop.create_task(EnergyAgentProxy(1234, 1235))
def tearDown(self) -> None:
logger.debug('Cancelling the tasks')
self.server.cancel()
self.gp.cancel()
self.loop.run_until_complete(asyncio.sleep(0.5))
@classmethod
def tearDownClass(cls) -> None:
logger.debug('Closing the event loop')
TestConnections.loop.close()
def test_client2server(self):
# start the client process, and wait until done
result = self.loop.run_until_complete(asyncio.wait_for(tcp_client(1235, message), timeout=2))
self.assertEqual(message, result)
现在,问题是:除非我在方法中添加 tearDown 最后一行
self.loop.run_until_complete(asyncio.sleep(0.5))
我收到关于代理上的任务尚未完成的错误:
ERROR:asyncio:Task 已销毁,但它处于挂起状态!
有什么方法可以让所有的任务都完成吗?我试过跑步
self.loop.run_until_complete(asyncio.wait([self.server, self.gp]))
和 asyncio.gather... 不成功。
【问题讨论】:
标签: python python-asyncio coroutine terminate