簡體   English   中英

EM內的光纖:連接(同步)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM