Изпълнявам този кодов фрагмент под 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, описано в тази статия без използване на em-synchrony.)
Редактиране: Ето някои повече подробности за това, което в крайна сметка се опитвам да постигна. Разработвам API на Grape, работещ на Thin, и всеки манипулатор на маршрути трябва да направи различни извиквания последователно към хранилища за данни, ZooKeeper, други HTTP услуги и т.н., преди да върне отговор.
em-synchrony е наистина страхотен, но продължавам да се сблъсквам с проблеми с отстъпване от коренното влакно или с резултати, показващи несинхронните симптоми на случая по-горе. rack-fiber_pool също изглежда потенциално полезен, но не съм склонен да се ангажирам да го използвам, защото, извън кутията, той разваля всичките ми модулни тестове на Rack::Test.
Намалих проблемите си в простия пример по-горе, защото изглежда, че имам фундаментално неразбиране относно това как трябва да се използват заедно влакна и EventMachine, което ми пречи да използвам по-сложните рамки ефективно.
Rack::Test
можете да опитате да гоuse
само на вашияconfig.ru
и да обвиете тестовете си във влакна, като използвате rspecaround
блок или нещо подобно. - person Renato Zannon   schedule 04.10.2012AC
е отпечатано. - person phil pirozhkov   schedule 06.10.2012