我有一个在 Tomcat 下运行的现代网络应用程序,它经常需要调用一些遗留的 perl 代码来获得一些结果。现在,我们将它们包装在对 Runtime.getRuntime().exec()
的调用中,它运行良好。
然而,随着 webapp 变得越来越繁忙,我们注意到 perl 经常超时,我们需要控制它。
我正在使用 commons-pool
来确保一次只能运行 X 个副本,线程会在需要时很好地排队等待 perl 实例,在 Y 之后超时秒并返回错误(这很好,客户端将重试)。
但是我们仍然存在 Perl 启动、解释脚本、执行和返回需要很长时间的问题。在繁忙的时候,我们每秒执行 30-50 次。这是一台强大的机器,但它开始挣扎了。
我已经阅读了 Speedy
和 PersistentPerl
并且正在考虑为我的池中的每个对象在内存中保留一个副本,这样我们就不需要每次打开和关闭 Perl。
这是个好主意吗?有关如何执行此操作的任何提示?
最佳答案
这些方法应该可以减少脚本启动时的开销。如果该脚本可以作为 CGI 程序运行,那么您最好提供让它与 Plack
一起使用。并使用 PSGI 服务器运行它。您的 Tomcat 应用程序可以收集请求参数并将其发送到您的脚本和/或在后台运行的“网络应用程序”。
关于multithreading - 运行 Speedy 或 PersistentPerl 的多个副本以从 Tomcat 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26972362/