【发布时间】:2019-01-18 20:27:54
【问题描述】:
我有一个 C++ 程序,它加载一个几百万行的文件并开始处理,同样的操作是由一个 php 脚本完成的,但是为了减少执行时间我切换到了 C++。
在旧脚本中,我检查了“暂停”文件夹中是否存在具有当前操作ID的文件,该文件为空这只是为了检查是否请求暂停,然后脚本在每5次迭代后检查如果有这样的文件,如果有它卡在一个空循环上,直到文件被删除(a.k.a resume):
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 命令)发送命令到后台任务暂停/恢复。
【问题讨论】:
-
你可以给你的进程发送一个信号,在收到这个信号后,它可以进入无限睡眠——下一个信号会唤醒它。这是解决该问题的技术含量相对较低的解决方案之一。
-
@SergeyA 知道如何在不“杀死”进程的情况下向进程发送信号吗?我见过的所有示例都使用 kill 命令
-
为什么要暂停/恢复?谁用你以前的方法创建/删除了文件?
-
您是尝试从同一进程内还是从外部限制任务?我不清楚。
-
尝试 SIGSTOP/SIGCONT。
标签: c++ performance resume pause