问题标签 [celluloid]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby - 使用 EOT、SOH、STX 等字符读取套接字
我正在使用赛璐珞 IO 从套接字读取。传入消息具有以下语法
一些文本一些文本一些文本
在哪里
我的阅读代码是这样的 -
我正在寻找一种可靠的方式从套接字读取直到 EOT。阅读消息后,我将正则表达式输出相关部分。
在套接字读取流和正则表达式中检测上述十六进制字符的一些指导将非常有帮助。指导?
ruby - 红宝石和赛璐珞
由于一些限制,我想将我当前的项目从 EventMachine/EM-Synchrony 切换到赛璐珞,但我在联系它时遇到了一些麻烦。我正在编写的项目是一个网络收割机,它应该尽可能快地抓取大量页面。
为了基本了解赛璐珞,我在本地 Web 服务器上生成了 10.000 个虚拟页面,并希望通过这个简单的赛璐珞片段抓取它们:
据我了解赛璐珞,期货是获得触发请求响应的方法(类似于 EventMachine 中的回调),对吧?另一件事是,每个参与者都在自己的线程中运行,所以我需要某种批处理请求,因为 10.000 个线程会在我的 OSX 开发机器上导致错误。
所以创建一个池是要走的路,对吧?但是:上面的代码遍历了 9999 个 URL,但只有 1300 个 HTTP 请求被发送到 Web 服务器。因此,限制请求和遍历所有 URL 会出现问题。
ruby - 红宝石赛璐珞和资源消耗
我是赛璐珞的新手,对池和期货有一些疑问。我正在构建一个简单的网络爬虫(参见底部的示例)。我的 URLS 数组有几十万个 URL,所以这个例子被剥离到几百个。
我现在要做的是分组到最大值。50 req/s 使用期货,获取他们的回调并进一步抓取 50 个 url 等。我对这段代码的问题:我希望它最多可以有 50 个线程,但在我的情况下它会产生多达 400 个甚至更多。如果输入数据增加,代码片段将完成,因为它无法产生更多请求(操作系统限制,在我的情况下为 OSX)。
为什么会产生这么多线程以及如何避免这种情况?我需要一个快速爬虫,它使用操作系统提供的所有资源,但不超过这个 :) 所以 2.000 个线程似乎是 OSX 的限制,所有超过这个值会让代码崩溃。
http - 赛璐珞和高性能 HTTP 请求
我尝试将现有的爬虫从 EventMachine 切换到赛璐珞。为了与赛璐珞取得联系,我在一个通过 Nginx 提供服务的 linux 机器上生成了一堆静态文件,每个文件 150 kB。
底部的代码应该可以完成它的工作,但是代码存在一个我不明白的问题:由于线程池大小为 50,代码应该最多产生 50 个线程,但它产生了 180 个线程。如果我将池大小增加到 100,则会产生 330 个线程。那里出了什么问题?
此代码的简单复制和粘贴应该适用于每个盒子,所以欢迎任何提示:)
顺便说一句,当我在 each_slice 循环之外定义池时,也会出现同样的问题:
ruby - 非阻塞 ruby UNIXSocket
序言:显然,我太愚蠢了。
我想UNIXSocket
在 Ruby 中公开一个简单的命令,它接受来自连接客户端的单个命令,而不会在处理时阻塞进一步的连接,直到套接字关闭(STDLIB 套接字会这样做),包括在 X 秒内不发送任何命令的客户端超时。我还想要的是Etc.getpwuid(socket.getpeereid.first).name
,或者:获取连接到该套接字的用户的用户名。
因为默认UNIXSocket
阻止了所有进一步的连接,所以我尝试使用 EventMachine 和赛璐珞来做到这一点:
EventMachine:
多个连接就像一个魅力,但没有办法访问客户端的UID
. 此外,即使您可以设置客户端超时,文档也没有说明何时实际触发。这种体验特别令人沮丧:EventMachine
(like get_peername
) 上的某些方法没有记录在任何 googleable API 文档中,因为它们隐藏在本机扩展中。getpeereid
不幸的是,即使在 C 代码中,EventMachine 中也没有等价物,所以我最终放弃了这一点。
赛璐珞:我打开了一个常规的 UNIXSocket,然后将所有打开的连接传递给async
赛璐珞监听器。这也一直在接受连接,但是当我尝试结束服务器进程时,赛璐珞线程无法关闭( ) ,Terminating X actors
即使我在我的方法(称为 via )中做得正确。唯一能弥补这一点的是。因为赛璐珞的文档告诉我,我也尝试了回声服务器示例,但这给了我需要的相同结果。socket.close
Actor.current.terminate
listen
async.listen
kill -9
celluloid-io
kill -9
我一直在考虑启动我自己的处理程序线程解决方案,但这些解决方案缺少自动超时,我希望有人已经解决了这个看似基本的问题。
我希望我在这里遗漏了一些东西。到目前为止,我的印象是 Ruby 上的 Unix 套接字缺少最基本的成分:/
ruby - 无法使用 Rubinius 2.0.0 gem 安装赛璐珞
我已将 rvm 设置为
它正确设置了版本
当我尝试
我得到错误
有什么问题?我知道赛璐珞支持 Rubinius,因为它是推荐的解释器。https://github.com/celluoid/赛璐珞
更新:感谢这个链接https://gist.github.com/4123305我明白了
我需要通过 -X19 标志
concurrency - Sinatra + websocket + 赛璐珞
嗨,有人知道如何放置一个在Celluloid:IO之上运行并使用 websocket 的 Sinatra 应用程序的快速代码示例吗?
我知道用于赛璐珞的 Reel 的存在(“Reel 是建立在 Celluloid:IO 之上的快速、非阻塞的‘事件’网络服务器” ......并且立即支持 websockets)但我还是想继续使用Sinatra,因为我喜欢它,我已经习惯了它,我宁愿不重写很多代码......
希望你能帮忙。
ruby - 有没有办法使用赛璐珞每微秒调用一个块?
我正在使用赛璐珞的every
方法每微秒执行一个块,但是即使我指定小数点,它似乎总是每秒调用一次块。
我希望每 0.5 秒调用一次。但它每秒被调用一次。
有什么建议么?
ruby - 如何使用赛璐珞从线程池运行 HTTP 请求?
我正在使用 Ruby 1.9.3,并在 Mac OSX 10.7 上对其进行测试。
我有一个Sender
应该向某个 URL 发送请求的类:
我有另一个进程应该从 RabbitMQ 队列接收消息并使用以下方式发送请求Sender
:
当我运行它时,我得到:
由于池管理器,我做错了什么导致进程崩溃吗?
ruby - Process.spawn 挂起
我正在使用赛璐珞创建作业处理服务器。我有一个工作人员池,它们从 beanstalkd 队列中获取任务,并通过Process.spawn
调用执行大量工作的 PHP 脚本来处理它。
这是我执行 PHP 命令的方式:
这在大多数情况下都有效。我已经完成了数百个工作的测试,一切都处理得很好。但是当我将它投入生产时,一些PHP 命令会无限期地挂起。
如果我杀死挂起的进程并查看 PHP 命令写入的日志文件,最后一条日志消息是任意数量的看似随机的不显眼的事件(也就是说,我无法辨别进程在挂起之前的进度) .
用于处理作业的 PHP 脚本已在生产中使用了几个月,但在 cron 上执行。所以唯一改变的是它们是从这个新的作业处理器执行的。
我是以错误的方式接近这个吗?Ruby 是否以某种方式暂停/休眠进程或类似的东西——我没有正确读取输出并且阻止它吗?
- - 编辑 - -
我切换到使用反引号运算符来执行命令(阻塞并不重要,因为赛璐珞演员是异步的):
到目前为止,这没有问题。使用反引号有何不同?