假设我用C编写了新的算法,
int addone(int a) {
return a + 1;
}
我想部署为Web应用程序,例如
响应,
Content-Type: text/plain
6
举办此类活动的最佳方式是什么?我在Apache2上使用Python mod_wsgi进行了现有设置,为了测试,我刚从C构建了一个二进制文件,并使用Python的os.popen2作为子进程调用。
我希望这非常快,而不是浪费开销(即我根本不需要其他Python的东西)。我可以将整个服务器专用于它,重新编译所需的任何东西等等。
我正在考虑研究Apache C模块。这有用吗?或者我可以构建SWIG包装器直接从Python调用,但如果我根本不使用Python,这似乎也很浪费。有什么提示吗?
答案 0 :(得分:3)
最简单的方法是将此程序编写为CGI应用程序(http://en.wikipedia.org/wiki/.cgi)。它将与支持公共网关接口的任何Web服务器一起运行。 输出格式需要遵循CGI规则。
如果您想充分利用Web服务器功能,那么您可以在C中编写Apache模块。这需要更多的准备工作,但可以完全控制。
答案 1 :(得分:2)
C中使用C语言的this微小动态网络服务器可以帮助你...它应该易于使用和自包含。
根据主页上显示的基准,您可以采用最快的解决方案!
答案 2 :(得分:1)
这个article from yesterday讨论了为什么不将C用作Web框架。我认为一个简单的解决方案是使用ctypes,它肯定比启动子进程更快。您应确保您的方法是线程安全的,并检查输入参数。
from ctypes import *
libcompute = CDLL("libcompute.so")
libcompute.addone(int(a))
答案 3 :(得分:0)
我不相信你现有的一般方法可能不是最好的方法。我并不是说Apache / Python必然是正确的,但是有一些令人信服的东西可以将架构中的问题分离出来,这些关注点是由高度集中的元素组成的,这些元素是整个系统中功能的专家。
让基于C的算法服务器与HTTP服务器分离可能会让您访问HTTP可伸缩性和缓存设施,如果事情太紧,可能必须在算法组件中进行设计(或重新设计)耦合。
在设计架构时,我认为性能问题本身并不是最好或唯一的原因。例如,带有基于C的驱动程序的YAWS deployment可能是一个非常高性能的选项。
答案 4 :(得分:0)
我刚刚使用libmicrohttpd设置了一项网络服务,并取得了惊人的成绩。在四核上,我每秒处理20400个请求,CPU只运行58%。这可能会部署在具有8个内核的服务器上,所以我期待更好的结果。一个非常简单的C服务会更快!
我已经尝试过GWAN,它非常好,但它已关闭,并且在虚拟环境中效果不佳。尽管如此,我会给予@Gil赞誉擅长支持它。我们刚刚遇到了一些问题,发现LibMicroHttpd可以更好地满足我们的需求。
如果你去了这里,如果你使用axivo中的CentOs
,你可能需要更新你的opensslrpm -ivh --nosignature http://rpm.axivo.com/redhat/axivo-release-6-1.noarch.rpm
yum --disablerepo=* --enablerepo=axivo update openssl-devel
答案 5 :(得分:0)
您可以尝试Duda I / O,它只需要Linux主机:http://duda.io