我有时会写这样的程序来处理离线数据:
load_model() //this may cost lots of time while(cin >> inputs) { result = process_input(inputs) cout << result } release_model()
这工作正常,如果我只需要处理离线数据。 但是,当数据一个接一个的时候我就陷入了困境。 由于每次都需要加载模型,这很耗时。
我想知道是否有任何方法将此程序转换成一个服务,而无需修改程序本身。 例如,我可以将cin和coutredirect到两个命名pipe道:
program < namedpipe_in > namedpipe_out
我可以像这样把input放到namedpipe_in中
cat input > namedpipe_in
并在另一个pipe道中读取结果:
cat namedpipe_out
但是,这个解决scheme是行不通的,因为一旦我把一些东西给了namedpipe_in,cat操作之后pipe道就会closures,程序退出。
我的问题是如何解决这个问题,使pipe道看起来更像是一个队列,而不是一个内存缓冲区。
感谢您的阅读时间。
也许我误解了你的问题。 请纠正我,如果这不是你正在寻找。
为了模拟你的例子,我写了一个简单的C ++程序,它只是接收每个输入字符串并反转它:
#include <iostream> #include <string> #include <algorithm> int main() { std::cout << ":start:" << std::endl; std::string str; while(std::cin >> str) { std::reverse(str.begin(), str.end()); std::cout << str << std::endl; } }
我的示例程序的输出二进制文件是strflipper
。
我有另一个名为in.log
的文件,它只是通过touch in.log
创建的输入文件。
现在我打电话
tail -f in.log | ./strflipper > out.log
如果我添加一些东西到不同的终端输入日志,输出日志得到调整,如下所示:
$ echo "abc" >> in.log $ echo "foo" >> in.log $ echo "bar baz" >> in.log $ cat out.log :start: cba oof rab zab
这当然是我的预期产出。 只要我不杀了程序,我添加到in.log
任何东西都会在该循环中自动处理,而不会杀死或重新启动strflipper
。