有没有一种方法可以查看AnyEvent事件队列?

4
我正在处理一个使用AnyEvent编写异步代码的Perl项目。在测试期间,我的代码中出现了一个 bug ,导致阻塞代码在我的测试完成后被调用,使测试看起来通过,但是阻塞调用最终会污染后面的其他测试。
我希望在测试的拆卸过程中验证AnyEvent是否正在等待其他阻塞调用。是否可以检查AnyEvent是否有任何尚未执行的调用?

据我所知,队列取决于你使用的事件循环实现。尝试查看名为AnyEvent::Loop的纯Perl实现,特别是变量@timer@idle(在源代码中查找)。 - mzedeler
3个回答

2
我的第一个答案被删除了,因为在我回答之后问题发生了改变。这让人非常沮丧,所以如果你想得到答案,你真的不应该像这样改变你的问题,而是应该修改它们,以便上下文保持清晰。
无论如何,关于你的新问题,AnyEvent本身没有事件队列,所以你不能查看它。虽然一些底层事件库有事件队列,但有些没有,它们中没有一个公开导出它们的事件队列。
更糟糕的是,即使使用事件队列也没有帮助,因为事件可能尚未进入队列,即使它已经发生了(例如,当你处理某个事件时,计时器可能已经过期,所以它不会在事件队列中,但它仍然会立即触发)。
最后,AnyEvent(作为基于事件的系统)永远不会等待阻塞调用。

作为问题的原始提问者,我自己没有进行更改。 - tbischel

0
使用AnyEvent::Debug来包装你的观察器并监听一个套接字以获取命令,包括“wl”以列出所有观察器,这将让你走向你需要的方向。
例如,您可以通过在代码中调用AnyEvent::Debug::shell::wl函数来获取观察器列表,然后使用AnyEvent::Debug::Wrapped方法进行迭代和检查。

-1

你的问题没有直接的答案,但我想建议两件事情可能会有所帮助

  • 使用 AnyEvent::Log 确保您知道异步分支发生的位置,它还将帮助您找到未被销毁的创建的对象

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

另外,请尝试查看您失去控制的条件变量和/或 IO 句柄的位置,最好让它们可用于销毁,这将使测试更容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接