假設我有一個I/O-bound操作。我有一個回調(或時間同步)Goliath或EventMachine如何切換上下文?
- EM如何切換到下一個請求保持前一個等待回調?
- 它如何保持Thread.current變量是孤立的?
- 如何模擬長時間運行的作業?
假設我有一個I/O-bound操作。我有一個回調(或時間同步)Goliath或EventMachine如何切換上下文?
1.如何EM開關proccess下一個請求保持前一個等待回調?
在任何反應堆模式中都有一個執行線程。意思是,一次只能執行一件事。如果反應堆正在處理該主線程上的請求,則不會介入其他請求(協作式調度)。現在,請求可以自願地(在EM中,我們有EM.next_tick { # block }
)或通過調度將來的操作:定時器(EM.add_timer { #block }
)或通過另一個IO操作來「放棄」控制!例如,如果您使用的是EM-Synchrony,那麼當您發出HTTP請求(通過em-http)時,那麼當發送請求時,光纖將被暫停,併爲您創建一個回調引擎蓋..當請求完成後,回調由EventMachine通過內部回調調用..並且控制返回到您的請求。如需更深入瞭解: http://www.igvita.com/2010/03/22/untangling-evented-code-with-ruby-fibers/
2.它如何保持Thread.current變量是孤立的?
沒有魔力。在Ruby中,我們有線程局部變量:Thread.current[:foo] = bar
。同樣,Fiber的語義也是一樣的,儘管有時會引起人們的警惕,即使用相同的機制..也可以使用Thread.current[:foo] = bar
。
在這裏看到:http://devblog.avdi.org/2012/02/02/ruby-thread-locals-are-also-fiber-local/
3.我怎樣才能仿真RLS長時間運行的工作嗎?
最好的辦法:將它們移到反應堆外面。 任何反應器系統都是如此。
一)創建一個作業隊列,並將它推到另一個進程 B)EM確實提供EM.defer
,它產生另一個線程。
選擇(a)儘可能在(b)之後..你會在以後感謝你自己。
謝謝@igrigorik。 3.我的意思是我有em-mongo,並且想要測試那個請求不阻止反應堆。也許有一些共同的地方可以讓我「睡覺」? –
你永遠不想在反應堆中使用睡眠。一切運行在主線程上(基本上),做一個睡眠會暫停一切。測試的最佳方法是查看您的服務器是否可以處理多個連接。你也可以做一些事情,如果你連接到mysql,在那裏你'SELECT SLEEP(1)'會導致MySQL阻塞,但是這發生在MySQL內部,而不是反應堆。然後,如果您發出10個查詢,則它們都應在1秒內返回,而不是10秒。 – dj2
'SELECT SLEEP(1)'正是我所需要的。謝謝! –