![](/img/trans.png)
[英]want the relationshiop between EM-Synchrony 、em-http-request and fiber 's?
[英]Fiber within EM:Connection (em-synchrony)
任何人都可以解釋為什么Redis(redis-rb)同步驅動程序直接在EM.synchrony塊下工作,但不在EM:Connection中?
考慮以下示例
EM.synchrony do
redis = Redis.new(:path => "/usr/local/var/redis.sock")
id = redis.incr "local:id_counter"
puts id
EM.start_server('0.0.0.0', 9999) do |c|
def c.receive_data(data)
redis = Redis.new(:path => "/usr/local/var/redis.sock")
puts redis.incr "local:id_counter"
end
end
end
我越來越
can't yield from root fiber (FiberError)
在receive_data
使用時。 從閱讀EventMachine和em-synchrony的源代碼,我無法弄清楚有什么區別。
謝謝!
PS:明顯的解決方法是將redis代碼包裝在EventMachine :: Synchrony.next_tick中,如問題#59所示 ,但鑒於EM.synchrony,我希望已經將調用包含在Fiber中...
PPS:同樣適用於使用EM::Synchrony::Iterator
你在這里做了一些相當棘手的事情。你正在為start_server提供一個塊,它有效地創建了一個“匿名”連接類,並在該類的post_init方法中執行你的塊。 然后在該類中定義一個實例方法。
要記住的是:當reactor執行回調或者像receive_data這樣的方法時,主線程(以及根光纖內)會發生這種情況,這就是你看到這個異常的原因。 要解決此問題,您需要將每個回調包裝在Fiber中執行(例如,請參閱Synchrony.add_(periodic)_timer方法)。
要解決您的實際異常:在光纖中包裝receive_data的執行。 外部EM.synchrony {}對於稍后由反應器安排的回調不會做任何事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.