2012-09-03 21 views
-1

可有人请从golang的文档上CGI解释此摘录:CGI与长时间运行的服务器

“ 注意,使用CGI意味着开始一个新的进程来处理每个请求,这通常比使用效率低长期运行的服务器这个包主要是为了兼容现有系统 “

我使用CGI来制作数据库放入和获取。

这是低效的吗?我应该使用“长时间运行的服务器”吗?

如果是这样的话是什么意思,我该如何实现它?

... http://golang.org/pkg/net/http/cgi/

回答

2

是的,这是低效的。开始一个全新流程的成本通常远不止是连接到一个已经存在的流程,或者是在当前流程的某个线程上进行一些操作。

根据是否有必要,这取决于。如果你正在创建一个搜索引擎来与谷歌竞争,我会建议CGI是而不是的路要走。

如果是每小时访问一次的个人网站,我认为你可能会逃避它。

就长期运行的服务器而言,通常可以为运行所有时间的Web服务器编写一些插件,并且Web服务器只是在需要时将请求传递给它(可能还有多个线程“它”)。

这样,它一直准备就绪,您无需等待Web服务器启动另一个进程来处理请求。

事实上,Apache本身通过一个模块(如插件)执行CGI,该模块在运行时将其自身集成到Apache中 - 外部进程的实际调用是从模块处理的。如果您对其进行网络搜索,则可以在mod_cgi.c中找到源代码,如果您认为它有帮助。

另一个例子是mod_perl这是一个Perl解释器模块,可在this link处获得。

+0

您可以链接到这样的插件,这样我就可以看到这样的事情放在一起和利用的例子吗?由于 – Peregrine

+0

所以,如果我用mod_cgi一样与我的Apache服务器和我写的由HTML POST开始一个python CGI脚本会在mod_cgi一样模块内启动,代替了自己独特的工艺,只要我指定一个处理程序脚本?解决这个效率低下的问题? – Peregrine

+0

@PrincePeregrine:没有,'mod_cgi'是运行Apache的_within_模块,是的。但其责任是通过CGI启动其他进程(即作为外部进程)。如果您要在Apache上运行你的Python代码,你需要的mod_python:http://www.modpython.org/ – paxdiablo

0

查看的一个选项是fastcgi,它是一个长时间运行的服务器程序,不会不断地重新启动每个请求。它曾经是因为C,C++,FPC等语言的内存泄漏导致快速cgi的缺点,因为它们不是垃圾收集。在一个fastcgi程序中出现一个小内存泄露,在数百万次访问该网站后可能会导致服务器关闭,而常规的旧CGI本身就是一个垃圾收集器:程序重新启动,因此每次有人请求页面并退出cgi时都会清理干净。在Go lang的情况下,内存泄漏不是问题,但是快速的cgi可能会有一些隐藏的变体,比如:如果golang在其垃圾收集器本身中有任何内存泄漏......(不太可能,但是可能会弹出类似这样的内容) - 也堆碎片....随着时间的推移..)

一般fastcgi和“长时间运行”是不成熟的优化。我看到有5位访问者访问他们的个人主页网站,每天大喊“嗨,也许我应该使用fastcgi”,实际上他们每天需要500万访问者 - 但他们喜欢时髦和酷,所以他们开始思考在他们的网站甚至被3人知晓之前快速cgi。

你需要问自己:是否你使用有大量的流量,并通过大量的流量的服务器我不是指100名游客一天......甚至1000名独立访客,每天不是很多。

目前还不清楚您是要为apache服务器编写Go lang cgi程序,还是为go服务器编写python程序,或者您是否正在编写具有python和perl cgi功能的go服务器。澄清你实际在做什么。

至于谷歌作为有人在另一个答案中发布的搜索引擎:如果你看看谷歌的历史,他们实际上通过一些cgi系统用C++/C编写他们的程序......而不是使用PHP,perl ,或者孩子们使用的其他时髦和酷炫的东西。在以前查看backrub项目及其模板系统。它被称为Ctemplate(C呼吁HTML模板编译的程序.....)

https://www.google.com/search?safe=off&q=google+backrub+template+ctemplate

的FastCGI是可能的东西,谷歌想通了,之前有一个FastCGI的,或者他们有类似的自己的专有解决方案FastCGI的,我不知道,因为我没有在谷歌工作 - 但由于它们使用C++/C程序功率谷歌在过去的日子(也许还是今天的一些东西),他们必须一直使用一些CGI技术,即使如果它被修改cgi技术的速度。