我有一个C ++程序,该程序可以加载几百万行的文件并开始处理,同样的操作由php脚本完成,但是为了减少执行时间,我切换到了C ++。
在旧脚本中,我检查了“ pause”文件夹中是否有一个具有当前操作ID的文件,该文件为空。这只是检查是否请求暂停,然后在每5次迭代后检查脚本如果有这样的文件,如果有的话,它停留在一个空循环中,直到该文件被删除(又名履历表):
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命令)发送到后台任务来暂停/继续。
答案 0 :(得分:2)
在大多数操作系统上,要跳到文本文件的37710行,需要先读取所有37710行。
在大多数操作系统上,文本文件是二进制文件,具有换行符的约定。但是操作系统不会缓存换行符。
因此,要查找换行符,必须读取每个字节。
如果您的程序保存了已到达文件的字节偏移量,则它可能会搜索到该位置。
您可以在关闭程序时将程序的状态保存到某个配置文件中,并将其设置为在再次启动时默认恢复。这将需要捕获您用来关闭的信号,使您的主逻辑注意到信号标志已设置,然后干净地关闭。这是一个非常C风格的操作。
现在,使程序可远程控制的另一种传统方法是让程序在TCP端口(和/或stdin)上侦听并在那里接受命令行命令。
要这样做,您需要编写一个REPL组件,然后将其连接到任何输入和输出。
要么在处理文件之间以协程的方式进行REPL,要么生成单独的线程来进行REPL,并使它与处理线程异步通信。
但是,这可能超出您的能力范围。此步骤的每一步(编写一个REPL系统,使其不阻止主要工作,响应命令,然后将其附加到TCP端口)都需要您付出一些努力和学习。