【问题标题】:What is the best way to control Twisted's reactor so that it is nonblocking?控制 Twisted 的反应堆以使其无阻塞的最佳方法是什么?
【发布时间】:2010-11-14 06:10:12
【问题描述】:

我不想运行 reactor.run(),而是偶尔调用其他东西(我不知道,比如 reactor.runOnce() 或其他东西),同时保持我自己的主循环。是否有扭曲的最佳实践?

【问题讨论】:

    标签: python twisted nonblocking


    【解决方案1】:

    是的。最佳实践是,这是一个坏主意,而且您永远不需要这样做。它不适用于所有反应器,当然你不能有两个不同的库想要这样做。

    为什么需要维护自己的主循环?很有可能,它类似于“我想使用 PyGame”或“我正在编写一个 GUI 程序并且我想使用 GTK 的主循环”或“我在 Blender 中使用 Twisted,它有自己的事件处理”。如果是这种情况,你应该问那个具体的问题,因为每个问题都有自己的答案。

    如果您绝对需要这样做(同样:您不需要)这样做的方法是定期致电reactor.iterate()。这将是缓慢的、中断的信号处理,并且相对于reactor.stop() 具有不稳定的语义。它会在你的程序中引入许多原本不会存在的错误,当你需要帮助诊断它们时,如果你问 Twisted 开发团队的某个人,他们会告诉你的第一件事是“停止这样做,你不要'不需要这样做'。

    【讨论】:

    • 我正在使用 pyglet。太糟糕了扭曲是这样的;它似乎让事情变得容易多了,只是不是我想做的。你可能是对的,我不需要在扭曲的 reactor.run 范式之外编写我的程序,但这并不能改变这样一个事实,即它对我来说不是一个非常优雅的解决方案。我宁愿重新编写自己的低级通信套件,也不愿处理这个问题。
    • 等等 - 有什么方法可以使用 pyglet reactor,这样我就不会处于事件驱动模型中了吗?我没有看到它,但那将是完美的。
    • 你可以使用 Pyglet reactor,然后你就可以在你的程序中同时使用 Pyglet 和 Twisted;这样你就不需要做除了 reactor.run() 之外的任何事情。
    • 总是最好的。有 2 种程序:适当的事件驱动程序,以及错误且仅响应某些类型的输入的事件驱动程序,并且在某些模式下会出现挂起和意外中断的错误。但是,您不需要同意我的观点:您的问题基本上是“我怎样才能让我的程序出错且缓慢”,而答案是“定期调用 reactor.iterate()”。 Twisted 不会阻止你编写糟糕的程序 :)。
    • 您可能会注意到,在描述“模拟事件”时,您必须使用“事件”一词,如“事件驱动”。 Twisted 不会将用户事件优先于模拟事件。事实上,它根本没有任何事件优先级机制。 (如果我们这样做会很好,但是您可以自己实现一个。) Twisted 是完全通用的。虽然您可以随意对特定的实现技术持不同意见,但请不要对 Twisted 做出不准确的陈述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2017-06-15
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多