4

我正在开发一个使用AnyEvent. 在测试期间,我遇到了这样一种情况,即我的代码中的一个错误导致在我的测试完成后调用被阻塞的代码,因此测试看起来像是通过了,但后来被阻塞的调用最终污染了其他测试。

我想要发生的事情是在测试的拆解中,验证它AnyEvent没有等待任何其他被阻止的呼叫。这是否可以检查AnyEvent它是否有任何尚未执行的调用?

4

3 回答 3

2

我的第一个答案已被删除,因为我回答后问题已更改。这是相当令人沮丧的,所以如果你想得到答案,你真的不应该像这样改变你的问题,而是修改它们,这样上下文就会保持清晰。

无论如何,至于您的新问题, AnyEvent 本身没有事件队列,因此您无法查看它。虽然一些底层事件库有一个事件队列,但有些没有,而且它们都没有公开导出他们的事件队列。

更糟糕的是,它甚至无济于事,因为事件可能尚未在队列中,即使它发生了(例如,在您处理某些事件时可能会超时,因此它不会在事件队列中,但它或多或少会立即触发)。

最后,AnyEvent(基于事件)从不等待被阻塞的调用。

于 2015-04-23T00:12:20.297 回答
0

使用AnyEvent::Debug包装您的观​​察者并在套接字上侦听命令,包括列出所有观察者的“wl”,这将为您提供所需的方法。

例如,您可以在代码中调用 AnyEvent::Debug::shell::wl 函数来获取观察者列表,然后您可以使用 AnyEvent::Debug::Wrapped 方法对其进行迭代和检查。

于 2012-09-17T19:20:07.127 回答
-1

您的问题没有直接答案,但我想提出两件事可能会有所帮助

  • 使用 AnyEvent::Log 确保您知道异步分支发生的位置,它还将帮助您找到您创建的不会被破坏的东西

  • 在子进程中运行您的测试例程,使用 AnyEvent->child 监视它并确保它在您继续前进之前退出

还要尝试查看您在哪里失去对创建的条件变量和/或 IO 句柄的控制,它们最好可供您销毁,这将使测试更加容易。

于 2012-09-17T19:12:21.270 回答