【问题标题】:Handling Processing-Intensive Event-Actions in Jython在 Jython 中处理处理密集型事件操作
【发布时间】:2011-06-24 19:29:37
【问题描述】:

我有一些长期流程,必须在我正在创建的 Jython GUI 中的给定按钮按下或其他事件时发生。

在这种情况下,似乎最好的选择是创建一个单独的线程来在事件发生时运行被调用的方法/函数。

最好的方法是什么?导入 Threading 并有一个我在 actionPerformed 时初始化和运行的类?使用调用者?似乎有很多方法可以解决这个问题,但在 Jython-Swing 环境中效果最好并且是“最快的”?

start = JButton( "Analyze", actionPerformed = self.do_analysis )

def do_analysis(self):
    ...
    Large Time Consuming Task
    ...

【问题讨论】:

    标签: python events jython


    【解决方案1】:

    我不能 100% 确定 jython 也有同样的问题,但是在 C Python 中,您会遇到 GIL 或全局解释器锁的问题。这意味着当您的后台线程正在运行时,GUI 线程无法启动(即使它已排队等待在另一个内核上运行)。您单击一个按钮,没有任何反应:(

    为了解决这个问题,我会将长时间运行的流程拆分为可以在事件上运行的短步骤,并将事件排队以在当前步骤结束时开始下一步。然后,如果需要,GUI 将能够在步骤之间运行。步骤越短,GUI 的响应速度就越快 - 50 毫秒到 100 毫秒应该没问题。

    这种方法有一个很好的副作用,即您无需担心线程、锁定、消息队列或其他任何事情。您可以尝试将这些添加到 GUI,但 GUI 事件和线程可能会发生冲突,从而导致一些非常奇怪且难以调试的错误。

    至于“最快”,这可能是较短后台任务的最低开销。如果您创建一个新进程来运行后台任务(在 Windows 中开销非常大),那么它将运行得更快,因为它有自己的内核,但启动/停止开销很高。

    【讨论】:

      【解决方案2】:

      在这种情况下,您可以通过记住 Jython 是在 JVM 上运行来获得最佳结果。 Jython 可以完全访问 Java 类,因此请使用 Java 线程 API 设置单独的计算线程。如果 CPU 负载足够高以至于使用更多内核会有所帮助,Java(jvm)将自行处理。

      在某些情况下,对于长时间运行的进程,人们使用jstack -l 获取正在运行的线程的nids,然后使用taskset 设置CPU 亲和性。 JVMnid是十六进制的,是一个线程对应的Linux进程的PID。其他操作系统可能具有类似的功能。

      一般来说,除了使您的 Jython 成为多线程之外,没有必要做任何事情。如果您使用 Python 线程模块,则您无法访问完整的 Java 线程功能集,但它确实在后台使用了 JVM 线程。只要记住限制您对全局变量的访问,否则您最终将重新创建全局解释器锁。 Queue 模块可以帮助解决这个问题。

      【讨论】:

        猜你喜欢
        • 2010-10-05
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 2011-03-14
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多