我一直在尝试在我的应用程序中使用基本的异步HTTP调用.
我尝试在我的应用程序中使用Rails 3异步堆栈演示中的一些代码:http://github.com/igrigorik/async-rails,但我得到"不能从根光纤中产生"而且我没有想从哪里开始.这是我追踪的最高点:
(eval):10:in `yield'
(eval):10:in `get'
app/controllers/home_controller.rb:62:in `index'
/Users/ct/.rvm/gems/ruby-1.9.2-rc2@og/gems/actionpack-3.0.0.beta4/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/Users/ct/.rvm/gems/ruby-1.9.2-rc2@og/gems/actionpack-3.0.0.beta4/lib/abstract_controller/base.rb:145:in `process_action'
Run Code Online (Sandbox Code Playgroud)
我的索引控制器方法很简单:
def index
http = EM::HttpRequest.new("http://www.google.com/").get
render :text => http.response
end
Run Code Online (Sandbox Code Playgroud)
我有所有正确的宝石,我有1.9.2-rc2,rails 3 beta 4,而且我很瘦.我也得到了async-rails应用程序本身使用相同的rvm和gemset运行良好.eventmachine reactor肯定在我的应用程序中运行.我喜欢任何有关如何使其正常工作的提示!
有没有人有EM :: Iterator的任何工作示例?我能找到的唯一例子似乎是(或指向)的副本:
http://yardoc.org/docs/eventmachine-eventmachine/EventMachine/Iterator
我没有在EventMachine的Rdoc中看到任何EM :: Iterator的实例,所以我不确定它是否是一个已删除的旧类.当我尝试使用EM :: Iterator时,我通常会收到以下错误:
NameError:未初始化的常量EventMachine :: Iterator
谢谢!
我用ruby-prof描述了我的基于事件机器的应用程序,发现了以下有趣内容:
5.28 0.00 5.28 0.00 4/4 Mutex#synchronize
90.72% 0.00% 5.28 0.00 5.28 0.00 4 Mutex#sleep
我认为ruby-prof只计算CPU滴答,因此我无法弄清楚为什么互斥锁睡眠会占用CPU时间.我假设它在内核级别上休眠而不计算光纤时间.有任何想法吗?更好的是,我希望Mutex#sleep能够释放对事件机器的控制权,因此它可以做其他事情.
希望将em-mongo用于从db加载文本的文本分析器脚本,分析它,标记关键字并更新db.
很想看到em-mongo的一些实例.只有一个我能找到的是github em-mongo repo.
require 'em-mongo'
EM.run do
db = EM::Mongo::Connection.new.db('db')
collection = db.collection('test')
EM.next_tick do
doc = {"hello" => "world"}
id = collection.insert(doc)
collection.find('_id' => id]) do |res|
puts res.inspect
EM.stop
end
collection.remove(doc)
end
end
Run Code Online (Sandbox Code Playgroud) 我在Goliath(eventmachine)下使用em_mysql2的activerecord.最奇怪的事情发生在我的用户模型上.当我第一次对/ users进行POST时,它只能按预期找到.当我做第二次POST时,我收到错误.
Mysql2::Error: This connection is still waiting for a result, try again once you have the result: INSERT INTO `users` (... and so on ...)
Run Code Online (Sandbox Code Playgroud)
对于我的任何其他模型或路线,都不会发生这种情况.我假设如果数据库连接处于混乱状态,我会在其他请求上看到相同的错误但是没有 - 所有其他数据库更新和GET请求似乎都运行正常.
有谁知道这只会发生在我的用户模型和仅用于User.save操作的情况下?活动记录是否以某种方式存储它用于执行Model.save的数据库连接并重新使用它?
编辑:
当我写这个问题时我不知道提到我使用ActiveRecord作为ORM.我也没有提到我异步向Mongo数据库发送请求以获取用户身份验证信息.
我的解决方案
事实证明,这个错误发生的唯一时间是来自Mongo的响应在MySQL的响应之前回来,这导致MySQL响应被不同的光纤接收而不是发出请求的光纤.由于我使用的MySQL2光纤实现使用光纤的objectID来管理连接,这似乎导致了这个问题.
ActiveRecord + MySql2 + Fibers + Goliath中的整体连接池不是完全支持的配置.(从那时起可能会有一些进展)
我正在Rails 3.1中编写一个简单的聊天室应用程序 - 用于学习目的.对于初学者我有所有需要的模型(消息,用户,房间等),事情很好.客户端每分钟轮询服务器(例如)并获得新消息(如果有).
我想将简单轮询更改为长轮询,并且无法确定是否可以在同一个应用程序中完成此操作,或者我是否必须为长轮询创建其他推送服务器.
我阅读了很多关于EventMachine的内容,并将我的rails应用程序更改为用户,因为我想将EventMachine用于事件驱动的机制.我认为EventMachine频道会派上用场.客户端将连接并等待聊天室中的消息,并且仅当一个人被发送到房间时它才会收到消息.
我无法弄清楚的是如何在所有客户端连接之间共享EventMachine :: Channel实例.这种方法是否可行,或者我是否采取了错误的方式?
如果可能的话,我想要一个可以作为Heroku上托管的单个rails应用程序运行的解决方案.
这是我的代码:
EventMachine.run {
conn = EM::Protocols::HttpClient2.connect request.host, 80
req = conn.get(request.query)
req.callback { |response|
p(response.status)
p(response.headers)
p(response.content)
}
}
Run Code Online (Sandbox Code Playgroud)
回调触发,也就是说,我得到状态的字符串输出等.
但我想要它做的是触发回调,然后重复.我计划实施更多逻辑,例如每次调整URL,但就目前而言,我只想要:
我对这种模式的理解是,该循环中的所有内容都会触发,然后返回,然后一直持续到我执行为止EM.stop.
现在,它检索URL数据,似乎挂起了.
我需要做某种回报才能继续吗?它为什么悬挂,而不是一遍又一遍地循环?
如果我用循环包围整个上面的代码块...结束它按预期工作..这是实现这个的正确方法吗?我想我很困惑,因为我认为一切都在EM.run重复时完成.
我看到了我能找到的所有地方,但似乎无法找到解决方案.我在Lion 10.8.2上使用xcode 4.5.1 - 我正在尝试为一个rails项目运行bundle而且它一直在干扰它.我正在使用宝石'瘦'用于heroku.现在我不得不做 - 没有人找到解决方案?
Bolanos@Jeremys-Mac-mini ?-1.9.3 fishfarm $ sudo gem install eventmachine
Password:
Building native extensions. This could take a while...
ERROR: Error installing eventmachine:
ERROR: Failed to build gem native extension.
/Users/Bolanos/.rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb
checking for rb_trap_immediate in ruby.h,rubysig.h... no
checking for rb_thread_blocking_region()... yes
checking for inotify_init() in sys/inotify.h... no
checking for __NR_inotify_init in sys/syscall.h... no
checking for writev() in sys/uio.h... yes
checking for rb_thread_check_ints()... yes
checking for rb_time_new()... yes
checking for sys/event.h... yes
checking for sys/queue.h... …Run Code Online (Sandbox Code Playgroud) RoR很好,但有时让我想把头靠在墙上(无论如何这可能是我的错).我只是尝试安装Thinweb-client gem,当我运行时sudo gem install thin,我收到以下错误(它需要先安装eventmachine gem):
sudo gem install thin
Fetching: eventmachine-1.0.1.gem (100%)
Building native extensions. This could take a while...
ERROR: Error installing thin:
ERROR: Failed to build gem native extension.
/usr/bin/ruby1.9.1 extconf.rb
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- mkmf (LoadError)
from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from extconf.rb:2:in `<main>'
Run Code Online (Sandbox Code Playgroud)
我已经搜索了"无法加载此类文件 - mkmf"错误,但大多数问题似乎都围绕着这样一个事实:它在1.8-dev中可用但不是1.8,但是当我运行1.9.3时我认为我有mkmf - 我验证了locate mkmf:
/home/ubuntu/.rvm/rubies/ruby-1.9.3-p362/lib/ruby/1.9.1/mkmf.rb
Run Code Online (Sandbox Code Playgroud)
mkmf所在的目录显然不在/ usr/lib/ruby/...目录下 - 我不确定这是否是我的问题,但它可能足以启动你们中的一位专家作为到底发生了什么以及解决方案可能是什么.
另外,我使用RVM安装ruby 1.9.3而不仅仅是gem install...
提前致谢!
我正在使用sidekiq (2.13.1)(请参阅此处的依赖项),websocket-rails (0.6.2)(请参阅此处的依赖项)和redis-semaphore (0.2.1)(请参阅此处的依赖项).
sidekiq已经在我的应用程序中运行了很长时间,但在安装后websocket-rails我不再能够执行我的sidekiq工作.它们都崩溃了这个堆栈跟踪:
2013-09-15T13:15:17Z 12682 TID-ouvinq47w INFO: Sidetiq::Clock start
2013-09-15T13:15:19Z 12682 TID-ouvinq47w INFO: Booting Sidekiq 2.13.1 using redis://localhost:6379/0 with options {}
2013-09-15T13:15:19Z 12682 TID-ouvinq47w INFO: Running in ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]
2013-09-15T13:15:19Z 12682 TID-ouvinq47w INFO: See LICENSE and the LGPL-3.0 for licensing details.
2013-09-15T13:15:19Z 12682 TID-ouvinq47w INFO: Starting processing, hit Ctrl-C to stop
2013-09-15T13:15:20Z 12682 TID-ouvjitprc EvaluationsJob JID-7a108bea6da948aee5f43a99 INFO: start
2013-09-15T13:15:20Z …Run Code Online (Sandbox Code Playgroud) eventmachine ×10
ruby ×8
thin ×2
activerecord ×1
asynchronous ×1
heroku ×1
iteration ×1
long-polling ×1
mkmf ×1
mongodb ×1
mutex ×1
mysql2 ×1
redis ×1
ruby-prof ×1
sidekiq ×1
websocket ×1