在单元测试下运行ZeroMQ-地址已在使用中
本文关键字:ZeroMQ- 单元测试 运行 地址 | 更新日期: 2023-09-27 17:57:44
我正在尝试使用TCP协议运行测试中的两个ZeroMQ REQ/REP端点。第一个测试执行良好。然后(通过套接字和上下文上对Dispose()的调用)释放端点,但是第二个测试(使用相同的TCP端点地址)失败,并显示异常"地址已在使用中"。为什么插座没有正确处理?
对我来说,这听起来像是一个并发错误——就好像网络堆栈或ZeroMQ没有足够快地清理资源,以便下一次单元测试再次分配它们。
如果你在两次测试之间睡得很短,会发生什么?(我不喜欢这样的解决方案,但用于调试…)
一个简单的潜在解决方案是使用不同的端口进行不同的测试。
我在单元测试中也得到了这一点。为了解决这个问题,我在套接字关闭后进行了10毫秒的睡眠(我正在重用上下文并执行进程内套接字)。
如果没有睡眠,我就会遇到已经在使用的问题。ZMQ在一个单独的线程上运行套接字,因此假设即使使用inproc,在重用地址以允许套接字线程关闭之前,也需要上下文切换。
我很惊讶,如果你正确地关闭了上下文,错误就会持续存在,就像你所期望的那样,等待套接字线程完成,确保地址被释放。您可能需要检查libzmq源代码,以了解详细情况。