用AJAX请求从客户机终止用c++编写的长时间运行的CGI脚本
Aborting a long-running CGI script written in C++ from client with AJAX request
我有一个用c++编写的CGI脚本,它在调度类型问题的蛮力计算中执行一个相对简单的循环。参数从数据库中收集,CGI脚本在web浏览器中使用JavaScript使用XMLHttpRequest在POST请求中传递参数来调用。这很好。但是有时它需要太长时间,我希望用户能够通过在脚本运行时单击浏览器中的按钮来中止脚本。
我已经从CGI脚本内部轮询了一个小文件。该文件可以包含'0'或'1',表示脚本应该中止。这也有用。然而,相对而言,文件I/O本身需要花费很多时间,我想知道是否有更优雅的方法来做到这一点?我只能每四五百万次迭代检查一次,否则就会遇到问题。我可以忍受,但我想知道我是否可以用环境变量来做到这一点,例如?
谢谢你的建议!
CGI是不灵活的,所以任何解决方案都应该依赖于其他方法。
复制策略:
-
将该文件放到ram磁盘上-文件IO应该下降
-
用TCP信令代替FS信令。让执行器脚本打开一个套接字,用于监听专用端口的"中止守护进程"。如果执行器脚本"socket"从"abort守护进程"中窥探到一个字节可用,它就会终止。一旦启动,执行脚本将只需要将打开的端口通信到"中止页面"。另一个由"Abort"按钮指向url的脚本需要与"Abort守护进程"通信,该端口发送"杀手字节"。
关于服务器运行PHP的额外信息,您可以尝试使用PHP缓存作为消息传递机制-参见APC store和相关内容。
其他缓存似乎存在-这里列出了其他缓存。
也许是矫枉过正- redis -他们说
Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息代理。
拥有大量支持的语言,包括C和PHP。值得注意的是在维基百科上有一个条目
经过一些初步测试,似乎PHP shmop
提供的共享内存设施将是我在当前可用的服务器环境中使用的最简单和最安全的。非常感谢Adrian Colomitchi,他为我指出了正确的方向(RAM磁盘==共享内存)!
- 正在等待在非阻塞文件描述符上长时间运行ioctl
- 如何在长时间运行的方法中等待信号?
- Lambda 捕获此函数和长时间运行的函数
- 为什么与Java和Python相比,使用Cmake运行C++程序每次都需要这么长时间?
- 在关闭应用程序期间正确关闭线程,该线程可能会运行很长时间的循环
- 对于长时间运行的程序,STL 内存管理是否"reliable"?
- 长时间运行的脚本的 symfony 执行
- C++linux应用程序在长时间运行后停止系统.如何找到原因
- 如果你以root用户身份运行这个C++程序,为什么它要花这么长时间才能完成
- 在 QThread 中运行长时间操作并将信号发送到主线程仍会冻结 UI
- 是否可以在谷歌测试运行中将测试标记为需要很长时间
- boost::asio::io_service析构函数运行很长时间
- 可执行文件在无限大小写(任何时间限制)下将运行多长时间
- 如何向编译器提供有关循环运行最长时间的提示
- 电话簿项目错误.在编译器中并没有发现错误,但当它运行很长时间后就会退出
- C/C++-模拟长时间运行
- 如何终止长时间运行的Qt线程
- 如何为长时间运行的程序执行文件输出
- 用AJAX请求从客户机终止用c++编写的长时间运行的CGI脚本
- 如何在QThread中正确处理来自长时间运行的任务的信号和事件