【问题标题】:communication with long running tasks in python在 python 中与长时间运行的任务进行通信
【发布时间】:2010-10-16 13:13:00
【问题描述】:

我有一个 python GUI 应用程序,它使用一个通过 ctypes 调用的 .so/.dll 中的长时间运行函数。

我正在寻找一种在函数在单独的线程或进程中运行时与其通信的方法,以便我可以请求它提前终止(这需要在 C 端进行一些工作,然后才能返回部分结果)。我想这需要从管道接收或读取某种信号,但我想让它尽可能简单。

您认为解决此类问题的最佳方法是什么?我能够更改 python 和 C 端的代码。

【问题讨论】:

标签: python multithreading process ctypes


【解决方案1】:

您需要在这里回答两个部分:一个是如何在两个进程(您的 GUI 和执行函数的进程)之间进行通信,另一个是如何更改您的函数以使其响应异步请求( “哦,我被告知只要归还我所有的东西”)。

找出第二个问题的答案可能会决定第一个问题的答案。您可以通过信号来做到这一点(在这种情况下,您将获得一个控制进程的信号处理程序,可以在其他地方查找更详细的说明,并在将控制权返回给您的函数之前更改您的内部数据结构),或者您可以拥有您的函数监控命令的控制接口(每毫秒,检查是否有命令等待,如果有,看看它是什么)。

在第一种情况下,您需要 ANSI C 信号处理(signal()、sighandler_t),在第二种情况下,您可能需要管道或类似的东西(pipe() 和 select())。

【讨论】:

    【解决方案2】:

    您提到您可以同时更改 C 和 Python 方面。为了避免在 C 中编写任何套接字或信号代码,将大型 C 函数分解为 3 个较小的独立函数可能是最简单的,这些函数执行设置、一小部分工作和清理。工作包的运行时间应该在大约 1 毫秒到 1 秒之间,以在响应性和低开销之间取得平衡。面对不断变化的数据大小,将计算分解成这样的偶数块可能很困难,但在一个同时进行 I/O 的大型函数中,您将面临同样的挑战。

    用 Python 编写一个工作进程,通过 ctypes 调用这 3 个函数。让工作进程检查 Queue 对象以获取来自 GUI 的消息以提前停止计算。确保使用非阻塞 Queue.get_nowait 调用而不是 Queue.get。如果工作进程发现要提前退出的消息,则调用 C 清理代码并返回部分结果。

    【讨论】:

    • 我会调查的,但看起来很难。 C 代码实际上非常复杂,可以在不同的上下文中调用,所以我希望保留我们目前拥有的单一的、面向未来的入口点。不过感谢您的建议!
    【解决方案3】:

    如果您在 *nix 上为您的 C 程序中的 SIGUSR1 或 SIGINT 注册一个信号处理程序,然后从 Python 使用 os.kill 发送信号。

    【讨论】:

    • 嗯...实际上需要便携。 windows上有没有类似的东西?
    【解决方案4】:

    你说过:信号和管道。

    它不必太复杂,但如果你使用现有的结构,它会比你尝试使用自己的结构要容易得多。

    【讨论】:

    • 您能详细说明一下吗?你会使用哪两个?在我看来,信号更简单,但无法向进程发送不同的消息,这可能是一种责任。
    • 我两个都用;用于带外控制信息的数据和信号管道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2013-07-08
    • 2014-09-10
    • 1970-01-01
    • 2012-08-13
    • 2022-01-01
    相关资源
    最近更新 更多