Я запускаю этот фрагмент кода под Ruby 1.9.2:
require "eventmachine"
require "fiber"
EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
EM.add_timer(2) do
print "B"
current_fiber.resume("D")
end
Fiber.yield
end
print "A"
val = fiber.resume
print "C"
print val
EM.stop
end
Я ожидаю, что на выходе будет «ABCD», а программа приостановится на две секунды после «A». Однако вместо этого он просто сразу выводит «AC», а затем ждет около двух секунд, прежде чем выйти. Что я делаю неправильно?
(Для справки, я пытаюсь воспроизвести поведение в стиле em-synchrony, описанное в эту статью без использования электронной синхронизации.)
Изменить: вот еще несколько подробностей о том, чего я в конечном итоге пытаюсь достичь. Я разрабатываю Grape API, работающий на Thin, и каждый обработчик маршрута должен последовательно выполнять различные вызовы к хранилищам данных, ZooKeeper, другим службам HTTP и т. д., прежде чем вернуть ответ.
em-synchrony действительно крутая вещь, но я продолжаю сталкиваться с проблемами с выходом из корневого волокна или с результатами, показывающими несинхронные симптомы, как в случае выше. Rack-fiber_pool также кажется потенциально полезным, но я не хочу его использовать, потому что из коробки он ломает все мои модульные тесты Rack::Test.
Я свел свои проблемы к простому примеру, приведенному выше, потому что у меня, похоже, есть фундаментальное непонимание того, как волокна и EventMachine должны использоваться вместе, что мешает мне эффективно использовать более сложные фреймворки.
Rack::Test
, вы можете попробоватьuse
сделать это только на своемconfig.ru
и завернуть свои тесты в Fibers, используя блок rspecaround
или что-то в этом роде. - person Renato Zannon   schedule 04.10.2012AC
было напечатано. - person phil pirozhkov   schedule 06.10.2012