"uncaught throw: async" при использовании async_sinatra с Rails EventMachine и Thin - PullRequest
2 голосов
/ 30 ноября 2011

Я пытаюсь настроить свою среду так, чтобы оба rails, EventMachine и async_sinatra играли вместе, и я предполагаю, что у меня что-то не так, потому что я получаю ошибку "uncaught throw: async".

Это то, что у меня есть в моем Gemfile:

source 'http://rubygems.org'

gem 'rails', '3.1.3'
gem 'sinatra'
gem 'async_sinatra'
gem 'execjs'
gem 'therubyracer'
gem 'eventmachine'
gem 'rack-fiber_pool',  :require => 'rack/fiber_pool'
gem 'thin'

Это конфиг.ру:

require ::File.expand_path('../config/environment',  __FILE__)
use Rack::FiberPool
run Longpoll::Application

Это то, что у меня есть в моем файле rout.rb:

match '/longpoll', :to => LongPoll

и это мой файл long_poll.rb:

class LongPoll < Sinatra::Base
  register Sinatra::Async

  aget '/longpoll' do
    body 'Hello world!'
  end
end

Есть идеи, что мне не хватает для этой настройки?

EDIT:

Я понял, что работа без rack-fiber_pool исправляет ситуацию. Кто-нибудь может подтвердить, могут ли они работать вместе или нет?

Еще один пример, который выдает ту же ошибку basic.ru:

#!/usr/bin/env rackup -Ilib:../lib -s thin
require 'sinatra/async'
require 'rack/fiber_pool'

class AsyncTest < Sinatra::Base
  register Sinatra::Async
  use Rack::FiberPool

  enable :show_exceptions

  aget '/' do
    body "hello async"
  end
end

run AsyncTest.new

Ответы [ 2 ]

2 голосов
/ 08 апреля 2012

, если увидели эту ошибку при использовании webrick, переключение на thin решило ее. поэтому я не могу напрямую подтвердить ваше предположение, но я предполагаю, что использование webrick, а также rack-fiber_pool может сломаться.

#!/usr/bin/env ruby
#
require "rubygems"
require "sinatra/async"

class AsyncTest < Sinatra::Base
  set :server, :thin

  register Sinatra::Async

  aget '/' do
    body "hello async"
  end

  run! if app_file == $0
end

приведенный выше код отлично работает для меня.

0 голосов
/ 15 ноября 2012

ИМО они взаимоисключающие.

rack-fiber-pool заботится о вызове async.callback с результатами оптоволокна. Он также позаботится о том, чтобы сделать throw :async, чтобы сказать thin, чтобы держать соединение открытым. async_sinatra также заботится о тех же самых вещах. Он вызывает async.callback, когда вы звоните body {}. а также throw :async думает, что должен сказать тонко, чтобы держать соединение открытым. Это проблема, которую вы видите. async_sinatra выдает: async и rack-fiber-pool перехватывает его и думает, что это настоящая ошибка.

Вы можете посмотреть на бросок async_sinatra здесь: https://github.com/raggi/async_sinatra/blob/master/lib/sinatra/async.rb#L69

и стеллаж для ловли здесь: https://github.com/mperham/rack-fiber_pool/blob/master/lib/rack/fiber_pool.rb#L24

Вы также можете проверить sinatra_synchrony, если хотите лучшее из обоих.

...