有没有办法查看AnyEvent事件队列

时间:2012-04-12 19:50:35

标签: perl unit-testing asynchronous anyevent

我正在使用AnyEvent异步编写的Perl项目。在测试期间,我的情况是我的代码中的错误导致在我的测试完成后调用被阻止的代码,因此测试看起来像是通过了,但被阻止的调用最终会在以后污染其他测试。

我希望发生的事情是在测试中进行拆解,确认AnyEvent没有等待任何其他被阻止的呼叫。是否可以检查AnyEvent是否有任何尚未执行的呼叫?

3 个答案:

答案 0 :(得分:2)

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

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

更糟糕的是,它甚至没有帮助,因为事件可能尚未出现在队列中,即使它已经发生(例如,在处理某个事件时计时器可能已经过去,所以它不会在事件队列,但它或多或少会立即触发)。

最后,AnyEvent(基于事件)永远不会等待被阻止的呼叫。

答案 1 :(得分:0)

使用AnyEvent::Debug包裹您的观察者并在套接字上听取命令,包括'wl'列出所有观察者,这将为您提供所需的一些方法。

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

答案 2 :(得分:-1)

你的问题没有直接的答案,但我想提出一些可能有用的建议

  • 使用AnyEvent :: Log确保您知道异步分支发生的位置,它还可以帮助您查找未创建的未被销毁的内容

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

同时尝试查看您对创建的条件变量和/或IO句柄失去控制的位置,它们最好可供您破坏,它将使测试更容易。

相关问题