在Python中暂停执行

时间:2014-07-18 23:32:17

标签: python c++ multithreading task

我正在实现一个Python插件,它是更大的C ++程序的一部分。该程序的目标是允许用户在Python中输入命令的动作。它当前从C ++函数接收一个字符串,并通过exec()函数运行它。然后,用户可以使用API​​来影响更大的C ++程序的更改。

我正在处理的当前功能是暂停执行功能。它需要记住它在代码执行中的位置以及任何局部变量的状态,并在满足条件后恢复执行。我对Python不是很熟悉,我想知道如何实现这个功能。我的第一个设计理念:

1)使用yield命令。 这在开始时似乎是一个好主意,因为当你使用下一个命令时它会记住我需要它的所有内容,但问题是,只要我知道,yield只返回到调用堆栈中的前一个级别。因此,如果用户调用产生它的函数,则只返回用户的代码,而不是更大的C ++程序。据我所知,没有办法将yield命令传播到堆栈中???

2)线程 创建一个主python线程,为每个命令创建一个线程。这个主线程会为每个执行的命令生成一个线程,并在完成后终止它。如果需要暂停并重新启动它,可以通过锁定队列来完成。

这是我想出的唯一两个选项。我不确定屈服函数是否有效或者它的设计目的是什么。我认为线程方法可行,但可能有点矫枉过正,需要很长时间才能发展。我也在寻找Python中的某种任务模块,但无法找到我想要的东西。我想知道是否有人有任何其他建议,因为我不熟悉Python。

编辑:正如评论中所提到的,我没有解释当脚本"暂停"时需要发生什么。 python插件需要允许C ++程序继续执行。在我看来,这意味着A)如果我们正在谈论单线程方法,或者B)向C ++发送消息(函数调用?)

编辑编辑:如上所述,我没有完全解释问题描述。我将发表另一篇文章,更好地陈述当前存在的内容,以及需要发生什么以及提供一些sudo代码。我是Stack Overflow的新手,所以如果这不是合适的回复,请告诉我。

2 个答案:

答案 0 :(得分:2)

每当在Python中发送信号时,立即执行暂停,直到正在使用的任何信号处理函数完成执行;在那一点上,执行从它停止的地方继续。我的建议是使用一个用户定义的信号(signal.SIGUSR1signal.SIGUSR2)。请查看此处的signal文档:

https://docs.python.org/2/library/signal.html

在程序开始时,您将定义一个信号处理函数,如下所示:

def signal_pause(signum, frame):
  if signum == signal.SIGUSR1:
    # Do your pause here - function processing, etc
  else:
    pass

然后在某个主程序中,你将为你刚创建的那个切换出默认信号处理程序:

signal.signal(signal.SIGUSR1, signal_pause)

最后,每当你想暂停时,你都会发送SIGUSR1信号:

os.kill(os.getpid(),signal.SIGUSR1)

您的代码将立即暂停,保存其状态,然后前往signal_pause函数执行您需要执行的操作。一旦该功能退出,将恢复正常的程序执行。

编辑:这假设您想要在暂停程序时做一些复杂的事情。如果您只想等待几秒钟或者请求一些用户输入,那么有一些更简单的方法(分别为time.sleepinput)。

编辑编辑:这假设您使用的是Unix系统。

答案 1 :(得分:0)

如果你需要与C程序通信,那么套接字可能就是你的选择。

https://docs.python.org/2/library/socket.html

您的两个程序之一充当套接字服务器,另一个作为套接字客户端连接到它。如果希望继续使用C ++程序,可以使用socket.send()发送继续消息。然后你的Python程序会使用socket.recv(),这会导致它等待,直到它收到来自C ++程序的消息。

如果你需要两个程序来互相发送信号,这可能是最安全的方法。