Chinaunix首页 | 论坛 | 博客
  • 博客访问: 396514
  • 博文数量: 69
  • 博客积分: 1984
  • 博客等级: 上尉
  • 技术积分: 953
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-28 00:43
个人简介

学无所长,一事无成

文章分类

全部博文(69)

文章存档

2015年(19)

2014年(14)

2013年(9)

2012年(17)

2010年(10)

我的朋友

分类: Python/Ruby

2014-01-04 00:31:29



Reel 为高性能应用提供了一组低阶的  Ruby API 。 如果你试图像使用 Unicorn 或 Puma 那样,将 Reel 直接作为一个 web server使用,那你最好再看看  
下面是一段简单示例,用于展示如何使用 Reel 创建一个简单的  "Hello World" web server:

  1. require 'reel'

  2. Reel::Server::HTTP.run('127.0.0.1', 3000) do |connection|
  3.   connection.each_request do |request|
  4.     request.respond :ok, "hello, world!"
  5.   end
  6. end
让我们逐行分析,看看他做了什么:

依赖:

  1. require 'reel'

This pulls in the following dependencies:

  • : 使用 Ruby 编写的基于 Actor Model 的并发对象框架。 Reel servers 实现为一个 Celluloid actors。每一个 server 都是一个并发对象,运行在自己的线程中。
  • :  Celluloid 的事件驱动 I/O。类似于  EventMachine 或 Node.js,不过 Fibers 取代了回调函数,而且 Celluloid actors 间可以无缝通信。 内部的 Celluloid::IO 使用了基于 的 reactor,因此可以实现类似 epoll 和 kqueue 的高性能(在一个单线程中可以处理海量的文件描述符等待事件)。这意味着 Reel 非常适合作为 用于处理大量的 idle connections的 servers,比如流服务器或者 Websockets 服务器。
启动 Reel::Server::HTTP

Reel::Server::HTTP 实现为一个 Celluloid actor,而且类似 EventMachine 和 Node.js,通过使用  Celluloid::IO 即可用一个单线程处理多个网络接入。

  1. Reel::Server::HTTP.run('127.0.0.1', 3000) do |connection|
这里调用的 #run 方法是由 Celluloid 自身定义的。它告诉 Celluloid 开启一个 actor,然后将主线程关联在它上面,并将这个 server actor 置于前端运行。其中的参数将传递至 Reel::Server::HTTP#initialize 方法。

Reel's initialize 被传入的参数 127.0.0.1 和 3000,指明其绑定到  localhost 和 3000 端口。

最后,我们将 connection 参数传入代码块。connection 是一个 Reel::Connection 对象,代表客户端接入到 Reel 的一个连接。

对 Reel::Requests 进行迭代


  1. connection.each_request do |request|
客户端连接可能使用了 或 ,因此一个连接可能发出多个 request 。为支持此 HTTP 特性,我们使用 #each_request 在 connection 上进行迭代。 

每个 request 在这里都是 Reel::Request 对象。每个 request 都包含所有信息:如动作,请求的 URI,headers,body 等等。这只是一个简单示例,因此我们暂时将这些忽略。
  • 参考  了解更多信息

发送 responses

现在我们已经有了一个 request,我们需要作出响应 (respond)! 这个程序很简单,因此我们不管 request 是什么,统统响应一个 "hello world"。
我们调用  的  #respond 方法,参数包含一个我们要发送的响应类型。

  1. request.respond :ok, "hello, world!"
我们需要了解的事实真相是 #respond 只不过是一个快捷方式,用于构造一个  对象 (you can ).

这行代码发送一个  HTTP/1.1 200 OK 响应至客户端,body 内容为 "hello, world!"

  • 参考: 获取关于发送 responses 的更多信息。

阅读(1638) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~