问题标签 [fibers]
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.
javascript - 如何设置 Node.js 纤维阻塞
我正在尝试使用 node-mongodb-native 创建一个更加同步的数据库模块。目前停留在纤维化 db.open
有什么建议么?谢谢。
ruby - 在加载了许多光纤的所有数据后停止 evenmachine
我尝试使用http请求和evenmachine从rest api获取数据。为此,请使用em-net-http、fibers(ruby1.9.2p290)。我的伪代码如下所示:
问题:加载所有数据后如何停止 EM?我计算了请求,但这是一种不好的做法。有什么模式可以做到这一点吗?我也使用了em-synchrony,但这对我来说比较慢。
谢谢
ruby - Ruby 1.9.3-p140 - 使用线程 - 如何等待所有结果从线程中出来?
我试图找出一种在主线程完成之前等待所有线程执行的好方法。
我怎样才能在下面的代码中做到这一点?
该程序将我的线程号 XXX。我的随机数是 YYY,几乎在主线程结束时与 while 循环中的点混合。如果我不使用 while 循环,程序会在线程完成之前完成。
ruby - Ruby 1.9.3-p140 - Ruby 程序中的最大线程数?
我正在玩 Thread,我发现我无法运行 10000 个线程。
它给了我以下错误:
然后我尝试查看最大数量是多少,当我组成 2046 个线程时,Ruby 将运行代码。
为什么是 2046?它似乎遵循一种记忆模式,如 512、1024、2046...
threading.rb 代码:
ruby-on-rails - 如何在 Tomcat 上为 JRuby/Rails 应用程序使用 Rack::FiberPool 和 EventMachine?
我有一个使用Rack::FiberPool和EventMachine的 JRuby/Rails 应用程序。我有一些基于事件的动作控制器:
当我使用瘦服务器手动运行时,它工作正常:
但是当我部署到 Tomcat 时它不起作用。无论如何在Tomcat中使用EventMachine?
谢谢。
ruby - EventMachine 与 em-synchrony 我需要正确限制我的 http 请求
我有一个消费者通过事件订阅从队列中提取消息。它接收这些消息,然后连接到一个相当慢的 http 接口。我有一个 8 个工作池,一旦这些都被填满,我需要停止从队列中拉取请求,并让正在处理 http 作业的纤程继续工作。这是我整理的一个例子。
我发现如果我在同步块中的一个while循环内调用睡眠,反应器循环就会卡住。如果我在 if 语句中调用 sleep (只睡一次),那么大多数情况下请求完成的时间是足够的,但充其量是不可靠的。如果我使用 EM::Synchrony.sleep,那么主反应器循环将继续创建新请求。
有没有办法暂停主循环但让纤维完成它们的执行?
ruby - 用异步版本 + 纤程替换 Ruby IO 库
是否可以用不同的实现替换所有 ruby IO 类,这些实现在幕后使用反应器和光纤?我的意思是,实际上所有使用原生 ruby IO 的库都将按预期工作,因为所有对 IO 的调用都将用纤维包装,它们将等待请求的操作。但是在等待连接/文件中的数据可用时,ruby 将服务于其他 io 操作。
ruby - 使用 EventMachine 和 Ruby 纤维等待异步调用
我在 Ruby 1.9.2 下运行这个代码片段:
我期望输出是“ABCD”,程序在“A”之后暂停两秒钟。但是,它只是立即打印出“AC”,然后在退出之前等待两秒钟。我究竟做错了什么?
(作为参考,我试图在不使用 em-synchrony 的情况下重现本文中描述的 em-synchrony-style 行为。)
编辑:这里有一些关于我最终想要完成的更多细节。我正在开发一个在 Thin 上运行的 Grape API,每个路由处理程序必须在返回响应之前对数据存储、ZooKeeper、其他 HTTP 服务等进行一系列调用。
em-synchrony 真的很酷,但我一直遇到从根光纤屈服或结果显示上述情况的非同步症状的问题。rack-fiber_pool 似乎也可能有用,但我不愿意承诺使用它,因为开箱即用,它破坏了我所有的 Rack::Test 单元测试。
我将我的问题简化为上面的简单示例,因为我似乎对应如何一起使用纤维和 EventMachine 有一个基本的误解,这使我无法有效地使用更复杂的框架。
ruby - Ruby在后台运行进程
我正在尝试编写一个小型控制台应用程序来播放 mp3。mp3 播放将由外部二进制文件处理,例如 mpg123,而播放控制、播放列表等将作为 curses 控制台应用程序实现。
假设我创建了一个“播放列表”对象,其中添加了许多曲目。当我播放曲目时,我需要在后台调用二进制文件,同时允许 UI 响应。我还需要能够跳到下一首曲目等。
我假设我需要为此使用线程或光纤?如何控制线程?
我以前没有做过任何线程化的 Ruby 编程。
有没有人有一个简单的例子来说明如何开始这个?
ruby - Ruby 的 Fiber 4kB 堆栈大小的后果
纤维对我来说是一个相对较新的概念。我知道每根光纤的堆栈大小限制为 4kB,我一直在读我应该“提防”这一点。这个限制对现实世界的影响究竟是什么?
编辑:
看起来这个 4kB 的限制毕竟不是一个障碍,它需要光纤本身内的大量局部变量 (4,045) 才能引发 SystemStackError。
不是最优雅的代码,但它似乎证明了光纤堆栈的局限性。似乎它只是返回值、局部变量(所有这些都包含对堆上对象的引用)和方法调用被放入堆栈。我没有测试从光纤调用的方法中的局部变量等是否是光纤堆栈的一部分。
编辑2:
修改了上面的代码。看起来被调用方法中的变量等成为了光纤堆栈的一部分。如果是这种情况,那么调用深度(即使没有递归)可能会成为一个更大的问题,因为方法本身可能需要比变量更多的堆栈空间(这似乎是对堆上对象的透明引用)。
以下代码在第 4,031 次迭代中失败,并表明被调用方法中的变量成为光纤堆栈的一部分:
编辑3:
刚刚尝试在 Rubinius 2.0 上运行初始代码示例。它的纤维似乎没有 4kB 的堆栈限制,尽管超过大约 3,500 次迭代它变得越来越慢,并且在大约 5,000 次迭代时它平均每秒迭代一次。我不知道 RBX 是否有限制,因为我在超过 5,100 次迭代时退出了执行。RBX 使用的内存也比 MRI 1.9.3 多几倍。
JRuby 1.7 似乎也没有 4kB 的光纤堆栈大小,如果光纤有最大堆栈大小,我不知道。我完成了第一个代码示例的 5,000 次迭代,没有出现任何问题,尽管正如可以预料的那样,JVM 消耗了几百 MB 的 RAM。