python - 在 Python 中暂停执行

标签 python c++ multithreading task

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

我目前正在开发的功能是暂停执行功能。它需要记住它在代码执行中的位置以及任何局部变量的状态,并在满足条件后恢复执行。我对 Python 不是很熟悉,我想请教一些如何实现此功能的建议。我的第一个设计想法:

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

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

这是我想到的仅有的两个选项。我不确定 yield 函数是否有效或者它的设计目的是什么。我认为 Threading 方法会起作用,但可能会矫枉过正,并且需要很长时间才能开发。我也在 Python 中寻找某种任务模块,但找不到我要找的东西。我想知道是否有人有任何其他建议,因为我对 Python 不是很熟悉。

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

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

最佳答案

无论何时在 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 系统。

关于python - 在 Python 中暂停执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24835212/

相关文章:

python - Microsoft Access 驱动程序 : Specified driver could not be loaded due to system error 1114

带有运算符重载函数的 c++17 求值顺序

c++ - 有一个新的转换运算符而不修改源

python - Python中的后台函数

java - 这个线程对于在java中的队列上共享的两个线程来说是安全的吗?

python - 德摩根定律是 Pythonic 吗?

python - 合并两个具有相同模式的 DataFrame

python - 使用填充堆叠不同长度的 Numpy 数组

c++ - 如何将 boost::string_view 转换为 std::string_view?

c# - 从线程返回一个值