提交 0d5b50ee 编写于 作者: J Jeremy Kemper

pluginize concurrent block body part

上级 6335f5d5
......@@ -288,12 +288,12 @@ def template_format
# Access the current template being rendered.
# Returns a ActionView::Template object.
def template
Thread.current[:_current_render]
@_current_render
end
def template=(template) #:nodoc:
@_first_render ||= template
Thread.current[:_current_render] = template
@_current_render = template
end
def with_template(current_template)
......
module ActionView
module BodyParts
class ConcurrentBlock
def initialize(&block)
@block = block
@body = []
start
end
def to_s
finish
@body.join
end
protected
def start
@worker = Thread.new { @block.call(@body) }
end
def finish
@worker.join if @worker && @worker.alive?
end
end
end
end
require 'abstract_unit'
require 'action_view/body_parts/concurrent_block'
class BodyPartsTest < ActionController::TestCase
RENDERINGS = [Object.new, Object.new, Object.new]
......@@ -21,82 +20,3 @@ def test_body_parts
assert_equal RENDERINGS.join, @response.body
end
end
class ConcurrentBlockPartTest < ActionController::TestCase
class TestController < ActionController::Base
def index
append_thread_id = lambda do |parts|
parts << Thread.current.object_id
parts << '::'
parts << Time.now.to_i
sleep 0.1
end
future_render &append_thread_id
response.body_parts << '-'
future_render &append_thread_id
response.body_parts << '-'
future_render do |parts|
parts << ActionView::BodyParts::ConcurrentBlock.new(&append_thread_id)
parts << '-'
parts << ActionView::BodyParts::ConcurrentBlock.new(&append_thread_id)
end
@performed_render = true
end
def future_render(&block)
response.template.punctuate_body! ActionView::BodyParts::ConcurrentBlock.new(&block)
end
end
tests TestController
def test_concurrent_threaded_parts
get :index
elapsed = Benchmark.ms do
thread_ids = @response.body.split('-').map { |part| part.split('::').first.to_i }
assert_equal thread_ids.size, thread_ids.uniq.size
end
assert (elapsed - 100).abs < 10, elapsed
end
end
class OpenUriPartTest < ActionController::TestCase
class OpenUriPart < ActionView::BodyParts::ConcurrentBlock
def initialize(url)
url = URI::Generic === url ? url : URI.parse(url)
super() { |body| body << url.read }
end
end
class TestController < ActionController::Base
def index
render_url 'http://localhost/foo'
render_url 'http://localhost/bar'
render_url 'http://localhost/baz'
@performed_render = true
end
def render_url(url)
url = URI.parse(url)
def url.read; sleep 0.1; path end
response.template.punctuate_body! OpenUriPart.new(url)
end
end
tests TestController
def test_concurrent_open_uri_parts
get :index
elapsed = Benchmark.ms do
assert_equal '/foo/bar/baz', @response.body
end
assert (elapsed - 100).abs < 10, elapsed
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册