代码之家  ›  专栏  ›  技术社区  ›  Ram Rachum

Python:将GUI进程与核心逻辑进程分离

  •  13
  • Ram Rachum  · 技术社区  · 15 年前

    我正在开发一个 Python project

    GUI当前的工作方式是启动核心逻辑包(称为 garlicsim )在与GUI相同的进程和线程上。这是可行的,但我知道这是一个有问题的方法,因为如果核心逻辑需要做一些困难的计算,GUI将挂起,我认为这是不可接受的。

    我该怎么办?

    我听说过在GUI之外的单独进程上启动核心逻辑的选项。这听起来很有趣,但我有很多问题。

    1. multiprocessing 包装或 subprocess
    2. 如何从GUI进程轻松访问模拟数据?毕竟,它将存储在另一个进程上。用户应该能够轻松顺利地浏览模拟的时间线。如何做到这一点?
    5 回复  |  直到 15 年前
        1
  •  6
  •   ron    15 年前

    你可能会在这里找到一些灵感: http://wiki.wxpython.org/LongRunningTasks 但是,它是用于多线程的,而不是用于多处理。

    • 对于多处理:可以使用 子流程 包装、使用 与之通信的子进程。为此,您需要一个命令行api,但它最终会派上用场,因为您可以进行独立于gui的单元测试。

    您甚至可以通过一个套接字来驱动i/o通信,这样就可以方便的模拟网络管理。

    编辑: 多重处理

        2
  •  2
  •   S.Lott    15 年前

    回答具体问题。

    “我用这个吗 multiprocessing 包装或 subprocess “启动新流程的程序包?”

    使用

    “如何从GUI进程轻松访问模拟数据?”

    您没有访问模拟过程对象的权限,如果这是您所要求的,那么模拟是一个单独的过程。您可以启动它,停止它,最重要的是,还可以通过发送到模拟器的命令队列发出请求。

    “用户应该能够轻松流畅地浏览模拟的时间线。这怎么办?”

    这只是设计。单进程、多进程、多线程对这个问题没有任何影响。

    • 文件。模拟时间线将写入文件。GUI读取文件。结果真的很好。

    • 请求/回复。模拟有多个线程,其中一个线程将命令从队列中取出,并通过(例如)将时间线发送回当前时刻,或停止模拟或更改参数并重新启动它来进行响应。

        3
  •  2
  •   Eli Bendersky    15 年前

    在这里,最简单的方法是在单独的线程中启动计算,并使用 Queue 物体。这些都是完全安全的,对于线程间的通信非常方便。

        4
  •  1
  •   Kylotan    15 年前

    不幸的是,尽管您认为GUI的选择不会影响答案是正确的,但是解决这个问题的最佳方法将在很大程度上取决于您的模拟数据到底在做什么。

    例如,如果它生成顺序数据,那么它可以通过线程安全或进程安全队列将其提供给GUI。但是,如果它改变了整个数据,并且您的GUI需要能够在任何给定的时间看到快照,那么通过沿队列发送整个状态来解决这一问题的成本可能太高,并且可能需要一种互斥体样式的方法来共享对数据结构的访问。因此,对数据所做工作的性质在这里是至关重要的。

    能够 是程序的副本,但通常不是)。同样,很难知道哪种方法最适合您的具体情况,尽管听起来您可以将核心逻辑作为命令行应用程序,并通过管道、套接字等进行通信。

        5
  •  0
  •   manifest    15 年前

    分布式数据对象的多处理或Pyro。

    http://pyro.sourceforge.net/

    您的模拟将分布式对象提供给GUI,GUI操纵它们并读取它们的属性。

    这两个库都将提供在网络上的可扩展性,没有任何麻烦,但可以在本地运行。当您的模拟开始处理太多的数字时,请添加更多的模拟服务器,以提供更多的分布式对象。