我有一个使用一个长期运行的功能从一个python GUI应用程序一个.so / .dll文件调用通过ctypes的。

我在寻找一种方法,而它的在单独的线程或进程中运行与功能进行通信,这样我可以要求它终止早期(其需要对C侧一些工作返回部分结果之前)。我想这将需要某种形式的信号接收或从管道读的,但我想保持尽可能简单。

什么你会考虑来解决这类问题的最好方法?我能够改变在Python和C两侧的代码。

有帮助吗?

解决方案

有两个部分,你需要在这里回答:一个如果如何将两个过程(您GUI和执行功能的过程)之间的沟通,另一个是如何改变你的函数,因此响应异步请求( “哦,我已经被告知,只是返回什么我已经得到了”)。

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

在第一种情况下,你想要ANSI C信号处理(信号(),sighandler_t),在第二你可能想的管或类似的(管()并选择())。

其他提示

您提到,您可以更改C和Python的两侧。为了避免必须编写C任何插座或信号的代码,它可能是最简单的,打破了大的C函数到执行设置,工作的一个小包裹,和清理3种较小的独立的功能。工作包裹应该是约1毫秒1秒的运行时间罢工的响应速度和低开销之间的平衡之间。它可以是很难计算分解成即使在不断变化的数据大小的块面像这样,但你必须在一个大的功能也做了我同样的挑战/ O。

写在Python工作进程通过ctypes的调用那些3种功能。有工作进程从GUI检查队列对象消息以停止计算早。确保使用非阻塞Queue.get_nowait呼叫,而不是Queue.get。如果工作过程中发现的消息提前退出,调用C清理代码,返回部分结果。

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

您表示它:信号和管道

它不必太复杂,但是这将是一个很大的挫折感更容易,如果您使用的不是,如果你尝试推出自己的现有结构。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top