我想弄清楚如果脚本需要超过1秒才能完成,gwan是如何响应的。
为此,我在hello.c
示例中使用了sleep()
函数:
#include "gwan.h"
#include <unistd.h>
int main(int argc, char **argv)
{
sleep(5);
static char msg[] = "Hello, ANSI C!";
xbuf_ncat(get_reply(argv), msg, sizeof(msg) - 1);
return 200; // return an HTTP code (200:'OK')
}
我从Chrome得到的响应时间是>= 5秒,正如预期的那样。
然后,我运行了一个Weighttp并发测试,这是我从Chrome得到的响应时间,以毫秒为单位。
这是缓存问题吗?5秒钟的睡眠时间都去哪儿了?谢谢。
您的sleep(5);
测试是毫无意义的(充其量),并且,正如预期的那样,G-WAN 超时阻塞脚本以避免阻塞服务器,因为脚本有bug。
如果阻塞servlet在并发下使用,就像您稍后所做的那样,然后,而不是无意义的每次执行超时(这将花费时间),G-WAN 将标记为该servlet有bug,并且不再执行它。
这个阻塞问题在一个更有趣的测试中不会存在:看看G-WAN如何在不阻塞的情况下提供10秒的系统PING 。
如果你有一个脚本需要5秒来完成它的工作,那么你不应该等待5秒。阻塞服务器线程是最不明智的做法。
如果你在另一个服务器上这样做,比如说,使用像Nginx这样的单线程程序,这只会阻止新的连接被处理:你的服务器会死。
G-WAN做得更好,因为(a)它使用多个线程,(b)因为它有专用的异步接口,见下文。
对于跨越很长时间的G-WAN提供的应答:
- 一个Comet API(参见Comet .c示例)
- 一个流API(参见stream1/2/3.c示例)
- 一个透明的异步接口,以避免阻塞I/o。
因此,如果您想了解G-WAN如何处理真实的慢脚本,那么编写一些实际的代码。