`
zsxxsz
  • 浏览: 452157 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用协程方式编写高并发的 WEB 服务

阅读更多

      在《使用 acl 协程编写高并发网络服务》中介绍了一个使用 acl 协程库编写高并发网络服务的应用示例,本节将展示一个稍微复杂些且更具实际意义的例子:基于协程的 WEB 服务器程序。下面首先展示这个 WEB 服务器程序:

#include "lib_acl.h"			// acl 基础库头文件
#include "fiber/lib_fiber.h"	// acl 协程库头文件
#include "acl_cpp/lib_acl.hpp	// acl C++ 封装库头文件

class http_servlet : public acl::HttpServlet
{
public:
	http_servlet(acl::socket_stream* stream, acl::session* session)
			: HttpServlet(stream, session)
	{
	}

	~http_servlet(void)
	{
	}

	// override
	bool doGet(acl::HttpServletRequest& req, acl::HttpServletResponse& res)
	{
		return doPost(req, res);
	}

	// override
	bool doPost(acl::HttpServletRequest&, acl::HttpServletResponse& res)
	{
		const char* buf = "hello world!";
		size_t len = strlen(buf);

		res.setContentLength(len);
		res.setKeepAlive(true);

		// 发送 http 响应体
		return res.write(buf, len) && res.write(NULL, 0);
	}
};

#define	 STACK_SIZE	32000	// 指定协程堆栈大小(字节)
static int __rw_timeout = 0;		// 网络 IO 超时时间(秒)

static void http_server(ACL_FIBER *, void *ctx)
{
	acl::socket_stream *conn = (acl::socket_stream *) ctx;

	printf("start one http_server\r\n");

	acl::memcache_session session("127.0.0.1:11211");

	// 基于 ACL HTTP 模块的 Http 服务类
	http_servlet servlet(conn, &session);
	servlet.setLocalCharset("gb2312");

	// 循环处理客户端的 HTTP 请求
	while (true)
	{
		// 调用 acl::HttpServlet 类中的方法,从而触发子类重载的 doPost/doGet 方法
		if (servlet.doRun() == false)
			break;
	}

	printf("close one connection: %d, %s\r\n", conn->sock_handle(), acl::last_serror());

	// 销毁客户端连接对象
	delete conn;
}

static void fiber_accept(ACL_FIBER *, void *ctx)
{
	const char* addr = (const char* ) ctx;
	acl::server_socket server;

	// 监听本机服务端口
	if (server.open(addr) == false)
	{
		printf("open %s error\r\n", addr);
		exit (1);
	}
	else
		printf("open %s ok\r\n", addr);

	while (true)
	{
		// 等待接收外来 HTTP 客户端连接
		acl::socket_stream* client = server.accept();
		if (client == NULL)
		{
			printf("accept failed: %s\r\n", acl::last_serror());
			break;
		}

		client->set_rw_timeout(__rw_timeout);
		printf("accept one: %d\r\n", client->sock_handle());

		// 创建协程处理 HTTP 客户端连接请求
		acl_fiber_create(http_server, client, STACK_SIZE);
	}

	exit (0);
}

static void usage(const char* procname)
{
	printf("usage: %s -h [help] -s listen_addr -r rw_timeout\r\n", procname);
}

int main(int argc, char *argv[])
{
	acl::string addr("127.0.0.1:9001");
	int  ch;

	while ((ch = getopt(argc, argv, "hs:r:")) > 0)
	{
		switch (ch)
		{
		case 'h':
			usage(argv[0]);
			return 0;
		case 's':
			addr = optarg;
			break;
		case 'r':
			__rw_timeout = atoi(optarg);
			break;
		default:
			break;
		}
	}

	acl::acl_cpp_init();
	acl::log::stdout_open(true);

	// 创建服务监听协程
	acl_fiber_create(fiber_accept, addr.c_str(), STACK_SIZE);

	// 启动协程调度过程
	acl_fiber_schedule();

	return 0;
}

      此例子的流程为:创建服务监听协程 ---> 启动协程调度过程 ---> 监听协程收到 HTTP 客户端连接后,创建 HTTP 协程处理该连接 ---> HTTP 协程与 HTTP 客户端进行交互。

      因为协程相对于线程来说是非常轻量级的,所以虽然针对每一个 HTTP 客户端连接都会创建一个新的协程,但这并不会费太多系统资源,因而可以支持非常高的并发连接。

 

       参考协程编程文章:网络协程编程

       个人微博:http://weibo.com/zsxxsz

       acl 下载:https://sourceforge.net/p/acl/

       github 地址:https://github.com/acl-dev/acl

       国内镜像:http://git.oschina.net/acl-dev/acl

       更多文章

       QQ 群:242722074

 

1
2
分享到:
评论

相关推荐

    高性能python http服务器+web协程框架,支持linux windows 平台

    传统的Python Web框架如Django和Flask在处理高并发请求时可能会遇到性能瓶颈,而这个框架则通过引入协程技术,实现了非阻塞的I/O操作,有效解决了这一问题。协程是一种轻量级的并发模型,允许在一个线程内同时执行多...

    libco协程库,附VS工程

    无需侵入业务逻辑,把多进程、多线程服务改造成协程服务,并发能力得到百倍提升; 支持CGI框架,轻松构建web服务(New); 支持gethostbyname、mysqlclient、ssl等常用第三库(New); 可选的共享栈模式,单机轻松接入千万...

    轻量级的 HTTP Server,支持线程和协程模式

    3. **分布式**:具备处理分布式环境的能力,适应云环境或集群部署,能够处理高并发和扩展性需求。 基于这些信息,我们可以推测这款 HTTP 服务器可能采用了类似 Python 的 Flask 或 CherryPy 这样的框架,它们都是轻...

    Swoole 是一个事件驱动、异步、基于协程的并发库,具有高性能的 PHP

    总的来说,Swoole通过事件驱动、异步和协程技术,将PHP从一个主要面向Web页面输出的脚本语言,转变为能够胜任高并发、高性能网络服务开发的强大工具。对于有志于在网络开发领域深入的PHP程序员来说,理解和掌握...

    tornado协程示例

    在Tornado中,协程主要通过`gen.coroutine`装饰器实现,允许开发者以同步的方式编写异步代码,从而简化了异步编程的复杂性。协程函数通常包含`yield`关键字,用于挂起和恢复协程的状态。 #### 二、编写协程函数 ...

    web_server.zip

    在IT领域,Web服务器是用于处理HTTP请求并返回相应数据的...通过分析和学习这个示例,开发者可以更好地理解如何在Python3中构建高性能、高并发的Web服务器,同时掌握多线程、多进程、协程和非阻塞并发等并发编程技术。

    C++开源协程库libco-原理与应用

    - **高性能**: 尽管采用了同步风格的接口,libco仍然能够支持高并发的网络IO操作,确保服务器能够高效地处理大量并发连接。 - **低延迟**: 由于协程之间的切换成本较低,libco能够有效地减少程序中的等待时间,从而...

    PHP实例开发源码—imi协程开发框架.zip

    imi协程开发框架为PHP开发者提供了一个高效、易用的平台,使得他们能够在PHP环境中充分利用协程的优势,开发出高并发、低延迟的应用程序。通过深入理解imi框架的特性和工作原理,开发者可以更好地利用PHP协程技术,...

    imi 协程开发框架 v2.1.53.zip

    imi 协程开发框架是基于 PHP 的高性能、高并发、轻量级的协程框架,专为微服务和高并发场景设计。v2.1.53 版本的发布,意味着该框架在稳定性和功能上又有了进一步的提升。imi 框架的核心特性在于其对协程的支持,它...

    Python协程的实现原理及相关技术.docx

    在高并发场景下,如Web服务器或实时数据处理,协程可以减少上下文切换的开销,提高系统吞吐量。 总结来说,Python协程通过生成器和`async/await`提供了一种轻量级的并发机制,允许程序在不阻塞的情况下处理多个任务...

    Hyperf协程框架 v2.0.25.zip

    Hyperf协程框架,作为一款基于Swoole协程的高性能、全栈PHP框架,以其轻量级、高并发、低延迟的特性,备受开发者青睐。版本v2.0.25是其发展历程中的一个重要节点,该版本在稳定性和性能优化上做了进一步提升,为...

    go+vue2并发直播聊天室

    这是一个并发聊天室的简单示例,后端使用Go语言实现高并发和消息广播,前端使用Vue.js通过WebSocket与后端实时通信。理解这种前后端分离但又需要实时交互的Web架构和实现方式,对于我们编写跨平台Web应用很有帮助。

    plainCms异步协程内容管理系统 v1.0.zip

    在IT领域,异步编程是解决高并发和高性能问题的重要手段,而协程则是实现异步编程的一种轻量级方式。本系统可能是用Python、Go或者JavaScript等支持协程的语言开发的,因为这些语言都有优秀的库或内建支持来实现异步...

    异步 Web 框架.zip

    Tufao利用了libevent库来实现异步I/O操作,允许开发者编写高性能的Web服务,而无需担心线程管理和资源消耗。 在异步Web框架中,主要涉及以下关键概念和技术: 1. **事件循环(Event Loop)**:这是异步框架的核心...

    Swoole异步并行和协程C扩展 v4.4.26.zip

    综上所述,Swoole v4.4.26提供了一个高效、易用的平台,帮助开发者在PHP环境中实现异步并行和协程编程,适用于各种高并发、高性能的应用场景。无论是学习、研究还是实际开发,都是一个不可多得的工具。

    Swoole异步并行和协程C扩展 v4.5.11.zip

    在Swoole v4.5.11这个版本中,它继续优化了性能,并修复了一些已知问题,为开发者提供了更加稳定和高效的开发环境。...通过异步并行和协程机制,Swoole极大地提升了PHP处理高并发的能力,是现代Web应用开发的有力武器。

    基于PHP的Hyperf协程框架源码.zip

    总的来说,Hyperf协程框架是PHP开发者深入学习高并发、微服务架构的重要资源,通过研究其源码,可以提升我们的PHP编程能力和系统设计能力。同时,Hyperf的开源特性也鼓励社区贡献,让框架不断进化和完善。

    基于PHP的imi协程开发框架.zip

    imi协程开发框架是专为PHP设计的一款高性能、轻量级的并发处理工具,它充分利用了PHP 7以上的特性,特别是对协程(coroutine)的支持,为开发者提供了构建高并发、低延迟的网络应用的强大能力。imi框架的出现,旨在...

    imi协程开发框架 v2.0.59.zip

    imi协程开发框架是专为PHP开发者设计的一款高效、轻量级的开发框架,它基于Swoole扩展,充分利用了Swoole的协程特性,实现了异步非阻塞的IO操作,极大地提升了PHP在处理高并发场景下的性能。imi框架的v2.0.59版本是...

Global site tag (gtag.js) - Google Analytics