问题标签 [concurrent-ruby]

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.

0 投票
2 回答
1688 浏览

ruby - 我应该如何限制使用 Concurrent-Ruby 创建线程?

我有一个使用concurrent-ruby gem 来同时处理大量 API 调用的进程,过Concurrent::Future.execute了一段时间,它就死了:

有没有一种简单的方法可以Concurrent限制它产生的线程数,因为我无法提前知道它需要进行多少 API 调用?

或者这是我需要在我的应用程序中明确编码的东西?

我正在使用Ruby 2.0.0(唉,目前没有选择更改它)

0 投票
3 回答
3579 浏览

ruby - 处理并发红宝石线程池中的异常

如何处理并发 ruby​​ 线程池中的异常(http://ruby-concurrency.github.io/concurrent-ruby/file.thread_pools.html)?

例子:


更新:

这是我的代码的简化版本:

所以我想要实现的是在出现任何异常时停止处理(中断循环)。

此异常也在更高级别的应用程序中得到挽救,并且执行了一些清理工作(例如将模型状态设置为失败并发送一些通知)。

0 投票
1 回答
799 浏览

ruby - 在并发 Ruby 中链接一系列任务

我有一组任务,我想在某个后台线程中按顺序执行,每个任务的结果都传递给下一个任务,如果链中的任何链接失败,链就会失败。

为了论证起见,假设每个任务都是一个具有exec返回值的方法的对象,尽管它们同样可以是 procs 或 lambdas。

我现在拥有的是这样的:

有没有更简洁的方法来做到这一点,无论是在PromiseAPI 中还是在 Concurrent Ruby 的其他地方?这似乎是一个相当基本的操作,但我没有看到现有的方法可以做到这一点。

(旁注:如果没有这样的方法,在 futures-and-promises 世界中是否有这种模式的知名名称?即,如果我自己编写该方法,是否有一些现有的明显名称? )

0 投票
2 回答
1157 浏览

ruby-on-rails - 如何从线程中捕获错误,然后在所有线程完成后重新抛出该错误?

我正在使用 Rails 5。我有这个用于管理线程的宝石......

我注意到如果我的一个线程抛出一个错误,它就会被吞掉,我永远不会发现它。我在控制台中试过这个

我想知道,如果我的池中的一个线程抛出错误,我可以在所有线程都完成后抛出异常,从而停止我的程序。如果没有任何线程抛出错误,那么我可以继续处理正在发生的事情。

在上面,你会注意到我故意导致了一个应该导致错误的条件,但我从来没有发现它,因为我猜线程池正在吞噬异常的输出。

0 投票
3 回答
5706 浏览

ruby-on-rails - Rails 中的多线程:自动加载常量时检测到循环依赖

我有一个 Rails 应用程序,其中有一个 Rake 任务,它使用 concurrent-ruby gem 提供的多线程函数。

我不时遇到Circular dependency detected while autoloading constant错误。

在谷歌搜索了一下之后,我发现这与使用线程结合加载 Rails 常量有关。

我偶然发现了以下 GitHub 问题:https ://github.com/ruby-concurrency/concurrent-ruby/issues/585和https://github.com/rails/rails/issues/26847

正如这里所解释的,您需要将从新线程调用的任何代码包装在一个Rails.application.reloader.wrap doRails.application.executor.wrap do块中,这就是我所做的。但是,这会导致死锁。

然后建议用于ActiveSupport::Dependencies.interlock.permit_concurrent_loads在主线程上包装另一个阻塞调用。但是,我不确定我应该用这个包装哪个代码。

这是我尝试过的,但这仍然会导致死锁:

谁能阐明我应该如何解决这个问题?奇怪的是我在生产中遇到了这个问题,而关于这个主题的其他信息似乎暗示它通常应该只发生在开发中。

在生产中,我使用以下设置:

config.eager_load = true

config.cache_classes = true.

所有环境的自动加载路径都是 Rails 默认的加上两个特定的文件夹(“models/validators”和“jobs/concerns”)。

eager_load_paths在我的任何配置中都没有修改或设置,因此必须等于 Rails 的默认值。

我正在使用 Rails 5,所以enable_dependency_loading应该等于false生产。

0 投票
1 回答
421 浏览

ruby-on-rails - 方法内的线程安全计数器

我看到一些这样写的重试代码,如果引发一些异常,它会尝试调用服务 3 次,我试图在非 MRI 多线程服务器中理解,这个计数器线程安全吗?是否有必要使用互斥锁锁定进程?

这就是它的名称

0 投票
2 回答
403 浏览

ruby-on-rails - Rails 安装突然需要并发 ruby​​ gem 并且失败

在系统升级到 macOS 10.14 后,我突然无法在 Ruby 1.8.7 上安装 Rails 3.2.5,因为现在需要一个新的 gem:Concurrent-ruby。

我能够在 macOS 10.13 上安装和使用这个系统。为什么并发红宝石突然成为一种要求?没有它,我怎么能找到继续前进的方法?

0 投票
1 回答
507 浏览

ruby-on-rails - 覆盖 activerecord 回调以异步运行它们

我正在开发一个 Rails 应用程序,目前我们正在迁移到 jruby。我们目前在我们的一个模型上有超过 10 个后回调,这会长时间阻止响应。

我需要包装/覆盖activerecord的后回调(after_save,after_update)以使用concurrent-ruby异步运行它们而不阻塞响应,但我不知道如何以正确的方式做到这一点。

我想做的是这样的

我只需要知道正确的语法以及这是否是此类事情的正确方法。将不胜感激任何建议。

0 投票
2 回答
1974 浏览

ruby-on-rails - Ruby on Rails - 在前端异步进行长 api 调用并将值返回给 js 的最佳方法?

我正在创建一个最多显示 9 个费率的搜索页面。在前端,我正在向我的 rails 应用程序发送一个请求,其中包含获取 9 个费率所需的数据。

在我的一个 Rails 控制器中,我爬取了一个网页以获取速率。这可能需要 2 到 15 秒之间的任何时间。

我想在后台运行所有 9 个请求,这样我就可以处理其他进来的请求。例如,用户可以进行搜索并显示建议的结果。

我正在尝试将 concurrent-ruby gem 与 Promises 一起使用。clean_params 变量是发出请求所需的数据数组。最多有 9 个请求数据。

这是我到目前为止所拥有的:

现在我看到所有对 api_get_rate 的请求都在启动,但是在我的api_get_rate函数中,我调用了另一个类中的方法,BetterRateOverride.check_rate. 当我同步运行相同的代码时,我成功地调用了上述方法,但是当我运行它时,我现在如何设置它,我的代码一旦到达这个调用就会挂起。为什么会这样?

在后台线程中是否不能从另一个类调用方法?承诺是否在后台线程中运行?我读到 Promises 在 ruby​​ 全局线程池中运行。

如果这不是最好的方法,你能引导我走向正确的方向吗?

谢谢你的帮助。

编辑:我认为这可能是我的代码死锁的问题: https ://github.com/rails/rails/issues/26847

0 投票
1 回答
35 浏览

ruby - 如何在 ScheduledTask 的执行方法中调用块?

我试图在Concurrent::ScheduledTask#execute方法中调用一个块,但块本身永远不会被执行。

我也尝试过使用Concurrent::ScheduledTask#new方法,但结果是一样的。我觉得这里可能有一个我遗漏的基本问题。任何帮助将非常感激!

输出如下:

我不确定为什么puts "hai from event x"根本没有显示。此外,执行此操作时没有延迟。应该分别有 78.75、750.0 和 37.5 秒的延迟,根本没有!