2010-07-18 62 views
2

说我有花哨的C语言编写的新算法,我该如何最好地部署用C编写的Web应用程序?

int addone(int a) { 
    return a + 1; 
} 

而且我想在

http://example.com/addone?a=5

与响应部署为Web应用程序,例如,

Content-Type: text/plain 

6 

举办类似这样的最佳方式是什么?我有一个在Apache2上使用Python mod_wsgi的现有设置,并且为了测试,我刚刚从C构建了一个二进制文件,并使用Python的os.popen2作为子进程调用。

我想这是非常快速,不浪费开销(即我根本不需要这个其他Python的东西)。我可以将整个服务器专用于它,重新编译所需的任何东西等。

我在考虑研究Apache C模块。这有用吗?或者我可以构建SWIG包装来直接从Python调用,但如果我根本不使用Python,这又会显得浪费。有小费吗?

回答

2

也许this微小的动态网络服务器在C语言中可以使用C语言可以帮助你..它应该很容易使用和独立。

根据主页上显示的基准,可能是最快的解决方案!

3

最简单的方法应该是将该程序编写为CGI应用程序(http://en.wikipedia.org/wiki/.cgi)。它可以在任何支持通用网关接口的网络服务器上运行。 输出格式需要遵循CGI规则。

如果你想充分利用网络服务器功能,那么你可以用C编写一个Apache模块。这需要更多的准备工作,但是可以让你完全控制。

1

article from yesterday有一个很好的讨论,为什么不使用C作为一个Web框架。我认为对你来说一个简单的解决方案就是使用ctypes,这肯定比开始一个子进程更快。你应该确保你的方法是线程安全的,并且你检查你的输入参数。

from ctypes import * 
libcompute = CDLL("libcompute.so") 
libcompute.addone(int(a)) 
0

我不相信你现有的一般方法可能不是最好的。我并不是说Apache/Python必然是正确的,但是在整个系统中,由高度专注的元素组成的高度集中的元素组成的架构中存在一些令人信服的分离问题。

让您的基于C的算法服务器与HTTP服务器分离可能会让您访问诸如HTTP可伸缩性和缓存设施等内容,否则这些内容可能必须在算法组件中进行工程设计(或重新创建)紧密耦合。

我不认为在设计架构时,性能问题始终是最好的或唯一的原因。例如,带有基于C驱动程序的a YAWS deployment可能是一个非常高性能的选项。

0

我刚刚使用libmicrohttpd设置了一个web服务,并且有惊人的结果。在四核处理器上,我一直处理20400个请求,而CPU只能运行在58%。这可能会部署在8核心的服务器上,所以我期待更好的结果。一个非常简单的C服务将会更快!

我已经尝试过GWAN,它非常好,但它已关闭,并且在虚拟环境中运行不佳。尽管如此,我会给@Gil的荣誉善于支持它。我们遇到了一些问题,发现LibMicroHttpd可以更好地满足我们的需求。

如果你走在这里,你可能需要如果你使用CentOS的从axivo

rpm -ivh --nosignature http://rpm.axivo.com/redhat/axivo-release-6-1.noarch.rpm 
yum --disablerepo=* --enablerepo=axivo update openssl-devel