- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
您好,我一直在阅读关于 Thin 的文档,我对 eventmachine 还比较陌生,但我知道 Deferrables 是如何工作的。我的目标是了解当 body 被逐部分延迟和流式传输时,Thin 是如何工作的。
以下是我正在使用并试图理解的示例。
class DeferrableBody
include EventMachine::Deferrable
def call(body)
body.each do |chunk|
@body_callback.call(chunk)
end
# @body_callback.call()
end
def each &blk
@body_callback = blk
end
end
class AsyncApp
# This is a template async response. N.B. Can't use string for body on 1.9
AsyncResponse = [-1, {}, []].freeze
puts "Aysnc testing #{AsyncResponse.inspect}"
def call(env)
body = DeferrableBody.new
# Get the headers out there asap, let the client know we're alive...
EventMachine::next_tick do
puts "Next tick running....."
env['async.callback'].call [200, {'Content-Type' => 'text/plain'}, body]
end
# Semi-emulate a long db request, instead of a timer, in reality we'd be
# waiting for the response data. Whilst this happens, other connections
# can be serviced.
# This could be any callback based thing though, a deferrable waiting on
# IO data, a db request, an http request, an smtp send, whatever.
EventMachine::add_timer(2) do
puts "Timer started.."
body.call ["Woah, async!\n"]
EventMachine::add_timer(5) {
# This could actually happen any time, you could spawn off to new
# threads, pause as a good looking lady walks by, whatever.
# Just shows off how we can defer chunks of data in the body, you can
# even call this many times.
body.call ["Cheers then!"]
puts "Succeed Called."
body.succeed
}
end
# throw :async # Still works for supporting non-async frameworks...
puts "Async REsponse sent."
AsyncResponse # May end up in Rack :-)
end
end
# The additions to env for async.connection and async.callback absolutely
# destroy the speed of the request if Lint is doing it's checks on env.
# It is also important to note that an async response will not pass through
# any further middleware, as the async response notification has been passed
# right up to the webserver, and the callback goes directly there too.
# Middleware could possibly catch :async, and also provide a different
# async.connection and async.callback.
# use Rack::Lint
run AsyncApp.new
我不太清楚的部分是 DeferrableBody 类在 call
和 each
方法中发生了什么。
我知道,一旦计时器作为存储在@body_callback 中的 block 触发,每个都会收到数据 block ,当在主体上调用成功时,它会发送主体,但何时是 yield
或 call
在这些 block 上调用它如何在发送时变成单个消息。
我觉得我对闭包的了解还不足以理解发生了什么。对此有任何帮助将不胜感激。
谢谢。
最佳答案
好吧,我想我弄清楚了每个 block 的工作原理。
Thin on post_init
似乎在连接进入时生成一个 @request
和 @response
对象。响应对象需要响应到 each
方法。这是我们覆盖的方法。
env['async.callback']
是一个闭包,分配给 connection.rb
类中名为 post_process
的方法数据实际发送到连接的方法,如下所示
@response.each do |chunk|
trace { chunk }
puts "-- [THIN] sending data #{chunk} ---"
send_data chunk
end
如何定义响应对象的 each
def each
yield head
if @body.is_a?(String)
yield @body
else
@body.each { |chunk| yield chunk }
end
end
所以我们的 env['async.callback'] 基本上是一个名为 post_process
的方法,定义在通过 method(:post_process)
访问的 connection.rb 类中,允许我们的方法像闭包一样处理,它包含对@response 对象的访问。当 reactor 启动时,它首先在 next_tick
中发送 header 数据,并在其中产生 head,但此时 body 是空的,因此不会产生任何东西。
在此之后,我们的 each
方法覆盖了 @response
对象拥有的旧实现,因此当 add_timers
触发 post_process
被触发将我们使用 body.call(["Wooah..."])
提供的数据发送到浏览器(或任何地方)
完全敬畏 macournoyer 和致力于瘦身的团队。如果您觉得这不是它的工作原理,请纠正我的理解。
关于ruby - 瘦异步应用程序示例如何缓冲对主体的响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11245872/
我正在接触 javafx。这就是我正在做的。 FXML Views DI Controllers Weld-SE Managed Services and Models Trying to confi
今天,我了解到使用胖模型和瘦 Controller 被认为是很好的做法。到目前为止,我的想法恰恰相反,所以我认为自己理解的有关 MVC 的一切现在都被证明是错误的。 大多数文章都表明胖模型/瘦 Con
我在 ear 中打包的瘦 war 中遇到了类加载问题。这里还封装了其他的ejb模块。有些可以通过 spring 加载,有些则不能。 想象一下以下场景: someApp.ear |- someEJBs1
我有一个项目,其中 3 个 war-modules 被打包在一个 ear-module 中。我的问题是每个库 jar 都包含在每个 war 模块以及 ear 模块中,这使得生成的 ear 文件非常大(
问题是如何使用 Oracle JDBC 瘦驱动程序并通过仅在 URL 中指定来强制加密? 据了解,我们需要将Oracle Net参数oracle.net.encryption_client设置为req
我尝试根据 RVM and thin, root vs. local user 设置精简服务和 http://wiki.rubyonrails.org/deployment/nginx-thin?re
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
我在使用 NetBeans V6.7.1 的 Oracle 11g 中遇到 JDBC Thin 问题。我不知道如何配置它。我已经设置了ojdbc6.jar和orai18n.jar的类路径。但我仍然无法
我有一个新的 tomcat 应用服务器运行在 tomcat 6、java 6 (openjdk)、centos 6.2 上。服务器是在centos 6.2主机上运行在qemu-kvm下的虚拟机。主机和
我的代码有效,但我知道最好有胖模型和瘦 Controller 。 但是,我使用了 3 种不同的型号,不幸的是我的 Controller 变胖了。组织此代码的最佳方式是什么(使用胖模型/瘦 Contro
很抱歉提出这样一个愚蠢的问题,但在文档中找不到它: filename.slim filename.html.slim 这似乎是一种非常适合使用的语言。我以前使用过 HAML,所以我认为这将是一个相当不
我已经从这个链接http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-10201-088211.html 下载了驱动程序
如何减少fontawesome fa-bars的粗细,增加垂直线之间的距离并延长水平线? .fa { margin: 40px; font-size: 14px; } 最佳答案 为什么不试
我有一个在 IE 和 Excel(用于报告)中呈现的 html 表格 如果我将 border-width 设置为 thin,它在 IE 中显示 2px 边框,在 Excel 中显示 1px 边框。 但
我有一个 Controller 操作,用于执行产品列表、分页和一些过滤器,例如类别(来自下拉列表)、标题(来自文本字段)、库存(来自复选框)这是我的 Controller : class Prod
通过 this question 上的慷慨帮助,我把下面的 MVVM 结构放在一起,它在 XAML(当前日期/时间)中实时显示模型的变化,非常好。 A cool advantage of this s
我刚刚读了一篇blog post这可以用银行类比来解释 MVC。我有几个月使用 MVC 框架(CakePHP)开发 Web 应用程序的经验,所以我掌握了基础知识,但我开始看到一个主题,让我认为我在放置
我最近向我的 Rails 路由文件添加了子域约束 constraints(:subdomain => 'new') do devise_for :customers do get "/cu
最干净的方法是什么?一些 Rack 中间件?我尝试修改 env['SERVER_SOFTWARE'] 但我仍然得到响应: Server: thin 1.3.1 codename Triple Espr
目前我正在使用 ojdbc14.jar Oracle 10g 瘦驱动程序来访问 Oracle 10g 数据库。 我想将驱动程序升级到瘦 ojdbc6.jar Oracle 11g 驱动程序提前数据库服
我是一名优秀的程序员,十分优秀!