在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
我们开始使用Ruby开发新游戏项目。我们决定使用其中一种异步Ruby服务器,但我们无法决定选择哪一种。选项是:歌利亚抽筋+消瘦/彩虹rack-fiber_pool+rack+thin/rainbowseventmachine_httpserver它们似乎都在处理HTTP请求。Cramp还支持开箱即用的Websocket和服务器端事件。您知道这些服务器的优缺点吗? 最佳答案 我使用eventmachine_httpserver公开了一个RESTfulAPIinanEventMachine-basedIRCbot绝对不会推荐它用于任何严
我一直在研究ruby的并行/异步处理能力,并阅读了许多文章和博客文章。我查看了EventMachine、Fibers、Revactor、Reia等。不幸的是,我无法为这个非常简单的用例找到简单、有效(且非IO阻塞)的解决方案:File.open('somelogfile.txt')do|file|whileline=file.gets#(R)ReadfromIOline=process_line(line)#(P)Processthelinewrite_to_db(line)#(W)WritetheoutputtosomeIO(DBorfile)endend你看到了吗,我的小脚本正
我使用RubyEventMachines已经有一段时间了,我想我已经了解它的基础知识了。但是,我不确定如何高效地读取大文件(120MB)。我的目标是逐行读取文件并将每一行写入Cassandra数据库(对于MySQL、PostgreSQL、MongoDB等也应该如此,因为Cassandra客户端明确支持EM)。这个简单的片段会阻塞react器,对吗?require'rubygems'require'cassandra'require'thrift_client/event_machine'EM.rundoFiber.newdorm=Cassandra.new('RankMetrics',
函数是:defcreateuser(name,pass,time)putsname,pass,timeend我试试:handle_asynchronously:createuser("a","b","c")得到一个错误:语法错误,意外'(',期待keyword_end谢谢。===编辑===日本的用户数据库和北京的网络服务器。所以我用这种方式来创建用户。defcreateuser(name,pass,time)Net::HTTP.get(URI.parse("http://www.example.net/builduser.php?hao=#{name}&mi=#{pass}&da=#{
我正在使用Goliath(由eventmachine提供支持)和postgresgempg,目前我以阻塞方式使用pggem:conn.exec('SELECT*FROMproducts')(例如)我想知道是否有更好的方法连接到postgres数据库? 最佳答案 pg库提供对PostgreSQL异步API的全面支持。我添加了anexample如何使用它到samples/目录:#!/usr/bin/envrubyrequire'pg'#ThisisaexampleofhowtousetheasynchronousAPItoqueryth
我在C#/.Net中做了很多开发,异步故事从第一天起就一直存在(诚然,多年来API从开始/结束到事件发生了显着变化,到Task和async/await).在过去一年左右的时间里,我一直在使用Node.js进行开发,它异步执行所有I/O并使用单线程事件循环模型。最近我在做一个我们使用Ruby的项目,对于应用程序的一部分,我觉得异步地发出一大堆Web请求是有意义的,并且惊讶地发现Ruby中的异步故事是巨大的不同的。执行任何异步I/O的唯一方法是使用EventMachine。我的问题归结为:为什么在.Net中(据我所知,Java/JVM也是如此)不需要事件循环,而且我可以触发异步请求在任何时
我有一组URL,我不想打开每个URL并获取特定标签。但我想并行执行此操作。这是我想做的伪代码:urls=[...]tags=[]urls.eachdo|url|fetch_tag_asynchronously(url)do|tag|tags如果这能以一种安全的方式完成,那就太棒了。我可以使用线程,但它看起来不像数组在ruby中是线程安全的。 最佳答案 您可以使用Mutex实现线程安全:require'thread'#forMutexurls=%w(http://test1.example.org/http://test2.exa
require'net/http'urls=[{'link'=>'http://www.google.com/'},{'link'=>'http://www.yandex.ru/'},{'link'=>'http://www.baidu.com/'}]urls.eachdo|u|u['content']=Net::HTTP.get(URI.parse(u['link']))endprinturls此代码以同步方式工作。第一个请求,第二个,第三个。我想异步发送所有请求并在所有请求完成后打印urls。最好的方法是什么?Fiber适合吗? 最佳答案
同步日志记录会导致很大的性能损失,因为它可能会阻塞。是否有一个独立的Ruby库可以进行异步日志记录(log4r似乎没有)?我可以修改标准库记录器以异步记录吗?我正在寻找类似log4j的AsyncAppender的东西-但最好是使用Ruby的代码块将尽可能多的工作转移到后台线程的实现。 最佳答案 我知道你不应该真正回答你自己的问题,但在ruby中似乎一切都很简单:require'thread'require'singleton'require'delegate'require'monitor'classAsyncincludeSi