Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby EM内的光纤:连接(EM同步)_Ruby_Redis_Eventmachine - Fatal编程技术网

Ruby EM内的光纤:连接(EM同步)

Ruby EM内的光纤:连接(EM同步),ruby,redis,eventmachine,Ruby,Redis,Eventmachine,有人能解释一下为什么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_serv

有人能解释一下为什么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)
内使用时,接收\u数据
。通过阅读EventMachine和em Synchronous的源代码,我无法找出两者的区别

谢谢

PS:显而易见的解决方法是将redis代码包装在EventMachine::Synchrony中。下一步,正如所暗示的那样,但是考虑到EM.Synchrony,我希望已经将调用包装在光纤中了


PPS:同样适用于使用
EM::Synchrony::Iterator

您在这里做了一些相当棘手的事情。。您提供了一个启动_服务器的块,它有效地创建了一个“匿名”连接类,并在该类的post_init方法中执行您的块。然后在该类中定义一个实例方法

需要记住的是:当reactor执行回调或类似receive_data的方法时,这会发生在主线程上(以及根光纤中),这就是为什么会出现这种异常。为了解决这个问题,您需要将要在光纤中执行的每个回调都包装起来(例如,请参阅Synchrony.add_(周期性)_计时器方法)


为了解决实际的异常:将接收数据的执行封装在光纤中。外部EM.synchrony{}不会对反应堆稍后计划的回调执行任何操作。

谢谢!提供该块只是为了使代码片段保持简短,否则它是一个常规类。我缺少的一点是“当反应器执行回调或类似receive_data的方法时,发生在主线程(和根光纤内)”部分。我想我的想法过于集中于类似于多线程的概念,在这种情况下,你会自动得到一个新的(池)线程。@igrigorik可以提供一个例子吗?我也在努力解决同样的问题。我应该将整个接收_数据封装在光纤中吗?我只想在Redis中保存数据。。。。