问题标签 [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-on-rails - 如何在 ruby 中禁用 GIL?
我对 Ruby 非常陌生,我正在研究一个项目来运行一个使用赛璐珞库实现的多线程 ruby 程序。
似乎当我尝试使用以下命令运行程序时:
代码运行不正常,它说 GIL 正在阻止它使用多个内核。我了解 GIL 是 ruby 解释器使用的锁定机制,但我想知道是否有一种方法可以使用特殊命令来禁用它以使并发程序运行。
如果这是不可能的,有没有其他方法可以在 ruby 中执行多线程程序/使用任何支持 Ruby 中的多线程的在线编辑器/IDE?
ruby - 赛璐珞演员 - 如何在使用期货时使用 Celluloid.shutdown_timeout 终止所有演员
到目前为止,它似乎可以正常工作,并且演员会在 1 秒后关闭。
但是当我尝试像上面那样访问值时,它会一直持续到从方法调用返回的值可用。
我的想法是像标准 Timeout.timeout(1) {}一样使用 Celluloid.shutdown_timeout
如果超过 1 秒的时间限制,则终止该块 [ Timeout.timeout(1)因行为不端而臭名昭著,因此不使用它]
使用赛璐珞演员实现这一目标的正确方法是什么?
multithreading - 处理更多请求的延迟/秒
我有一个使用赛璐珞的 JRuby 应用程序。它通过 Zeromq 套接字接收请求并以 JSON 字符串响应。
因此,我的应用程序中有 2 个参与者,一个用于处理请求,另一个用于发送响应(Zeromq 中的推送套接字)。应用程序以大约 30 个请求/秒的速度接收请求,未来会更多,例如 1000 个/秒。但是随着每秒请求数量的增加,处理需要更多时间。它开始使用更多的 CPU。
对于每个收到的请求,我都在 defer 块内处理它。
对于 20 个请求/秒,它可以正常工作,没有任何延迟。该服务器具有 15Gb RAM 和 4 个内核的配置。它还连接到 Postgres DB 和 Redis DB。但这似乎不是问题。
这是我的基本结构,有主要参与者服务,
这在内部创建了带有 10 个池的 PushSock Actor 实例。
上面 defer 块中的 send_response 方法调用 pushsocket actor。在延迟块 ResponseHandler 不是一个演员。
因此,对于 Service Actor,我没有使用池。
ruby - 数据库池 CelluloidZMQ vs Celluloid vs Thread
我看到了一些我试图理解的奇怪问题,该问题的第一部分是试图了解数据库池在赛璐珞与赛璐珞/ZMQ 中的工作方式。
数据库池。
1) 螺纹。
请注意,我正在输出(ting)connection id
线程使用的那个。O/p
如您所见,执行 SQL 语句的每个线程返回不同的连接 ID。SELECT version();
根据我的假设,以上是完全有效的。
2) 赛璐珞
O/p
同样,正如预期的那样,每个赛璐珞演员都会产生一个新的连接 ID。完全有效。
3) 赛璐珞/ZMQ
- 发件人(又名客户端)
- 接收器(又名服务器)
现在,有趣的部分。执行此操作时。
我看到以下输出。
所有查询都使用相同的连接 ID。
这就是我的问题...
为什么Celluloid/ZMQ
使用相同的连接 ID。理想情况下,它应该为每个async
调用使用不同的。
ruby-on-rails - 红宝石赛璐珞“环境”
我对赛璐珞很陌生,但我不明白为什么在我的 Rails 应用程序中,我的未来会失去当前的语言环境:
基本上我得到了类似的东西
当我更改语言环境时,期货会继续考虑我的默认语言环境:它
我觉得我错过了一些基本的东西......
ruby-on-rails - `require': 无法加载此类文件 -- 赛璐珞/当前 (LoadError)
我不明白为什么active_support
要把赛璐珞当作依赖。
sockets - 赛璐珞::TaskTerminated:任务已终止
我正在使用 celluloid-zmq,并且正在连接到应用程序中的多个套接字。应用程序继续在后台循环监听,但是当我关闭特定套接字时,它给了我这个错误“Celluloid::TaskTerminated: 任务已终止”
我正在结束异常循环,
ruby - 如何处理 ZeroMQ + Ruby 中的线程问题?
偶然阅读有关线程安全的ZeroMQ 常见问题解答。
我的多线程程序在 ZeroMQ 库中的奇怪地方不断崩溃。我究竟做错了什么?
ZeroMQ 套接字不是线程安全的。《指南》中对此进行了详细介绍。
简短的版本是套接字不应在线程之间共享。我们建议为每个线程创建一个专用套接字。
对于每个线程的专用套接字不可行的情况,当且仅当每个线程在访问套接字之前执行完整的内存屏障时,才可以共享套接字。大多数语言都支持互斥锁或自旋锁,它们将代表您执行完整的内存屏障。
我的多线程程序在 ZeroMQ 库中的奇怪地方不断崩溃。
我究竟做错了什么?
以下是我的以下代码:
现在,有几件事我不清楚:
1) 假设async
产生一个新的Thread
(每次)并且write_socket
在所有线程之间共享并且ZeroMQ表示它们的套接字不是线程安全的。我当然看到了write_socket
线程安全问题。
(顺便说一句,到目前为止,在所有端到端测试中都没有遇到这个问题。)
问题1:我对此的理解是否正确?
为了解决这个问题,ZeroMQ 要求我们使用 Mutex、Semaphore 来实现这一点。
这导致问题2
2) 上下文切换。
给定线程应用程序可以随时进行上下文切换。查看 ffi-rzmq 代码Celluloid::ZMQ
.send()
内部调用send_strings(),内部调用send_multiple()
问题 2:上下文切换可以发生在(任何地方)内部(甚至在关键部分)(这里)[ https://github.com/chuckremes/ffi-rzmq/blob/master/lib/ffi-rzmq/socket.rb#L510 ]
这也可能导致数据排序问题。
我的以下观察是否正确?
笔记:
ruby - Ruby - 使用 EventMachine/Celluloid 并发多个异步非阻塞 HTTP IO
我将puma服务器用于聚合来自 14 个 HTTP 客户端请求的响应的服务。我在请求之间有一些依赖关系,但它们可以在某种程度上并行。每个请求可能需要 1.8s 秒,而 ruby/cpu 时间仅为 50ms (97.3% IO)。
目前,我正在使用自动缩放的 heroku dynos,每个进程有 25 个线程。使用 MRI/CRuby 并假设 jRuby 将大大提高可伸缩性,因为我同意Elyasin 的说法。
Puma 在处理并发请求方面做得很好,而其他请求被 IO 阻塞。但我仍然需要并计划以非阻塞方式并行 HTTP 客户端请求。
在我的场景中使用jubilee对vert.x进行基准测试之前。我希望对标准 ruby 选项进行基准测试,例如EventMachine::MultiRequest或Celluloid,或其他建议的选项。为了真正了解 jubilee/vert.x 的性能比 puma 与 event-machine 好多少。请参阅Ruby 基准测试和 jubilee。
我的问题是:
- 哪种选择最适合 Puma?
- 当EM::HttpRequest(例如)“非阻塞等待”响应时,哪个替代方案的设计方式可以发挥最佳 Puma 的事件循环,并承诺启用 Puma 处理并发请求?
- 为了实现这一点,我应该使用 EventMachine/Celluloid 的特定配置或用法吗?
- 总的来说,任何关于这种情况的想法都会受到赞赏。