C++ pause/resume system on large operation
C++ pause/resume system on large operation
我有一个 C++ 程序加载一个几百万行的文件并开始处理,同样的操作是由 php 脚本完成的,但为了减少执行时间我切换到 C++。
在旧脚本中,我检查了"pause"文件夹中是否有当前操作id的文件,该文件为空只是为了检查是否请求暂停,然后脚本检查每 5 次迭代后,如果有这样的文件,如果有,它会卡在一个空循环中,直到文件被删除(a.k.a 恢复):
foreach($lines as $line)
{
$isFinished = $index >= $countData - 1;
if($index % 5 == 0)
{
do
{
$isPaused = file_exists("/home/pauses/".$content->{'drop-id'});
}while($isPaused);
}
// Starts processing the line here
}
但由于磁盘访问相对较慢,我不想采用相同的方法,所以我在考虑某种模拟此操作的命令:
$ kill cpp_program // C++ program returns the last index checked e.g: 37710
$ ./main 37710
$ // cpp_program escapes the first 37709 lines and continues its job
您如何看待这种做法?可行吗?不费时吗?有没有更好的方法?
谢谢
编辑:澄清一下,因为这看起来有点模棱两可,这个任务在后台运行,有另一个应用程序启动这个,我希望能够从管理应用程序发送命令(通过 Linux 命令)到后台任务到 pause/resume.
遗憾的是,在大多数操作系统上,跳转到文本文件的第 37710 行需要阅读它之前的所有 37710 行。
在大多数操作系统上,文本文件是二进制文件,具有关于换行符的约定。但是 OS 不会缓存换行符所在的位置。
所以要找到换行符,您必须读取每个字节。
如果您的程序保存了它到达的文件的 字节偏移量,它可以搜索到那个位置,但是。
您可以在关闭时将程序状态保存到某个配置文件中,并将其设置为在再次启动时默认恢复。这将需要捕获您用来关闭的信号,让您的主逻辑注意到信号标志被设置,然后干净地关闭。这是一个非常C语言的操作。
现在,另一种使程序可远程控制的传统方法是让它侦听 TCP 端口(and/or stdin)并在那里执行命令行命令。
要做到这一点,您需要编写一个 REPL 组件,然后将其连接到任何输入和输出。
要么在处理文件之间以类似协程的方式执行 REPL,要么生成一个单独的线程来执行 REPL 并让它与处理线程异步通信。
但是,这可能超出了您的技能范围。这其中的每一步(编写一个 REPL 系统,使其不阻塞主要工作,响应命令,然后将其附加到 TCP 端口)都需要您付出一些努力和学习。
我有一个 C++ 程序加载一个几百万行的文件并开始处理,同样的操作是由 php 脚本完成的,但为了减少执行时间我切换到 C++。
在旧脚本中,我检查了"pause"文件夹中是否有当前操作id的文件,该文件为空只是为了检查是否请求暂停,然后脚本检查每 5 次迭代后,如果有这样的文件,如果有,它会卡在一个空循环中,直到文件被删除(a.k.a 恢复):
foreach($lines as $line)
{
$isFinished = $index >= $countData - 1;
if($index % 5 == 0)
{
do
{
$isPaused = file_exists("/home/pauses/".$content->{'drop-id'});
}while($isPaused);
}
// Starts processing the line here
}
但由于磁盘访问相对较慢,我不想采用相同的方法,所以我在考虑某种模拟此操作的命令:
$ kill cpp_program // C++ program returns the last index checked e.g: 37710
$ ./main 37710
$ // cpp_program escapes the first 37709 lines and continues its job
您如何看待这种做法?可行吗?不费时吗?有没有更好的方法? 谢谢
编辑:澄清一下,因为这看起来有点模棱两可,这个任务在后台运行,有另一个应用程序启动这个,我希望能够从管理应用程序发送命令(通过 Linux 命令)到后台任务到 pause/resume.
遗憾的是,在大多数操作系统上,跳转到文本文件的第 37710 行需要阅读它之前的所有 37710 行。
在大多数操作系统上,文本文件是二进制文件,具有关于换行符的约定。但是 OS 不会缓存换行符所在的位置。
所以要找到换行符,您必须读取每个字节。
如果您的程序保存了它到达的文件的 字节偏移量,它可以搜索到那个位置,但是。
您可以在关闭时将程序状态保存到某个配置文件中,并将其设置为在再次启动时默认恢复。这将需要捕获您用来关闭的信号,让您的主逻辑注意到信号标志被设置,然后干净地关闭。这是一个非常C语言的操作。
现在,另一种使程序可远程控制的传统方法是让它侦听 TCP 端口(and/or stdin)并在那里执行命令行命令。
要做到这一点,您需要编写一个 REPL 组件,然后将其连接到任何输入和输出。
要么在处理文件之间以类似协程的方式执行 REPL,要么生成一个单独的线程来执行 REPL 并让它与处理线程异步通信。
但是,这可能超出了您的技能范围。这其中的每一步(编写一个 REPL 系统,使其不阻塞主要工作,响应命令,然后将其附加到 TCP 端口)都需要您付出一些努力和学习。