Tag: multithreading

设置Sidekiq:Heroku上的并发

我无法弄清楚Heroku上的并发是如何工作的,以及如何设置最佳:concurrency Sidekiq的:concurrency值 这是设置 – Puma Web Server 2 workers 5 threads Heroku Dynos 8 web dynos 2 “worker” dynos (These will run Sidekiq, not to be confused with Puma Workers) DB Connections 120 Max Connections Allowed by Postgres 5 Active Record Pool Size (default) ?? Sidekiq :concurrency value 每个Puma工作者都可以使用默认的5个ActiveRecord DB连接(这对于每个有5个线程的连接很好)。 由于每个Web Dyno中有2个这样的Puma工作者,因此每个Web Dyno最多可以使用10个连接。 在所有8个Web dynos中,它们占用了80个连接 […]

如何在使用activerecords和多个线程时管理打开和关闭数据库连接

我试图在rails中实现multithreading方法,以便我可以非常快速地创建/更新多个记录。 这是我的计划的大纲。 ActiveRecord::Base.transaction do (1..10).each do |i| arr[i] = Thread.new { … … obj.save! } end arr.each {|t| t.join} end 这给了我日志的警告。 DEPRECATION WARNING: Database connections will not be closed automatically, please close your database connection at the end of the thread by calling `close` on your connection. 它给了我一个错误 could not obtain a database connection within […]

是puma唯一的multithreading导轨4 http服务器?

我已经将我们的堆栈转换为Rails 4(是的!) 我希望利用线程安全的代码。 Puma工作起床,停止它似乎是一个不同的问题:( Puma是唯一的multithreading导轨吗? Thin -> EventMachine Unicorn -> Forking Puma -> multi-threaded Mongrel -> don’t care Webbrick -> don’t care

Rails.cache在不同的线程中没有缓存?

我在rails项目中遇到缓存方法结果的问题。 我来到这个模拟两个不同请求的代码: [ Thread.new { puts Rails.cache.fetch(‘a’, expires_in: 2.seconds) { rand } }, Thread.new { puts Rails.cache.fetch(‘a’, expires_in: 2.seconds) { rand } } ] 尝试在rails控制台中执行它。 如果我尝试在控制台中作为输出运行它,我得到不同的数字。 怎么可能? 但是例如这段代码(带睡眠)按预期工作: [ Thread.new { sleep(1); puts Rails.cache.fetch(‘a’, expires_in: 2.seconds) { rand } }, Thread.new { puts Rails.cache.fetch(‘a’, expires_in: 2.seconds) { rand } } ]

如何实现与http请求一起独立运行的计时器?

我有一个ruby代码,通过https触发php脚本。 使用案例: php脚本通常在5分钟内完成,因此我在10分钟后设置了https请求的超时时间。 我需要一个计时器,它会在https请求启动后7分钟后触发代码。 我正在考虑使用我在创建https请求之前创建的线程。 我不确定这是否是正确的方法来解决这个问题。 也许根本不需要使用线程。 我正在使用ruby 1.8.7(2010-08-16 patchlevel 302)[i386-mingw32]。 如果我能成功完成https请求后“杀死”该线程,我现在也不会。 uri = URI.parse(url) start = Time.new http_read_timeout=60*10 connection = Net::HTTP.new(uri.host, 443) connection.use_ssl = true begin response = connection.start() do |http| http.open_timeout = 50 http.read_timeout = http_read_timeout http.request_get(uri.request_uri) # here I need to place a code that is triggered # in case of custom […]

从外面停止一个线程

我有一个线程在后台做事情,我想在我的程序有真实的事情时暂停它。 一旦完成,我希望后台线程继续。 例如 ta = Thread.new { loop { print ‘a’; sleep 0.2 } } sleep 0.5 # put ta to sleep 5.times { print ‘b’; sleep 0.2 } # let ta resume sleep 0.8 puts 输出应该像aaabbbbbaaaaa 。 目前是aaabababababaaaaa 。 虽然一个线程可以通过Thread.stop自行停止,但是我找不到从“外部”停止线程的方法。 有简单的解决方案吗?

如何将Monitor对象传递给Ruby中的两个线程对象?

创建Ruby线程时,在Thread.new之后给出一个块,在new之后,线程立即开始执行。 而Ruby使用Monitor类作为互斥锁。 但我不明白如何将监视器对象传递给线程执行体。 请参阅以下示例代码: thread1 = Thread.new do sum=0 1.upto(10) {|x| sum = sum + x} puts(“The sum of the first 10 integers is #{sum}”) end thread2 = Thread.new do product=1 1.upto(10) {|x| product = product * x} puts(“The product of the first 10 integers is #{product}”) end thread1.join thread2.join 我想创建一个Monitor对象,并将其传递给thread1和thread2以同步puts语句。 怎么做? 请给我示例代码。 这个问题可以更普遍地提出来。 如何将对象传递给线程执行块?

如何异步收集在ruby中实时创建的新线程的结果

我想继续检查数据库中的表以查找要运行的命令。 某些命令可能需要4分钟才能完成,大约10秒钟。 因此我想在线程中运行它们。 因此,每条记录都会创建新线程,并在创建线程后删除记录。 因为DB查找+线程创建将在无限循环中运行,我如何从线程获取’响应’(线程将发出shell命令并获取我想要阅读的响应代码)? 我想过创建两个带有无限循环的Thread: – 首先是DB查找+创建新线程 – 第二个是…以某种方式读取线程结果并对每个响应进行操作 或者也许我应该使用fork,或者os生成一个新进程?

调试线程ruby应用程序

我正在开发一个使用线程的ruby应用程序。 我无法调试它。 主要问题是我想逐步完成一个特定的线程。 我设置断点并运行,但在使用thr sw 2类的东西之前没有任何反应。 但后来的输入是FUBAR。 我试过撬,但撬似乎没有更好的处理线程。 解决方案? 变通? 编辑1: 仅供参考:使用byebug Pry version 0.10.1 on Ruby 2.0.0上byebug Pry version 0.10.1 on Ruby 2.0.0 所以这就是我对Pry的体验。 尝试1:我使用break设置特定于线程的断点 让程序运行。 断点被触发。 撬正确地向我显示了断点和周围的代码。 什么都没有。 我没有提示 。 Control-C不起作用。 事实上,我必须从外面杀死-9这个过程。 尝试2:使用上面的“binding.pry”方法。 相同 相同 相同! 我得到了一个Pry提示! 我可以表达。 我尝试使用“步骤”或“下一步”,突然我在“Pry :: history #load”中。 所以现在调试器已跳转到正在处理输入本身的线程。 这不起作用。 撬输出: [2] pry(#)> step From: /usr/local/rvm/gems/ruby-2.0.0-p598/gems/pry-0.10.1/lib/pry/history.rb @ line 37 […]

如何异步运行非常少量的代码?

我想在我的rails应用程序中异步运行少量代码。 该代码记录了一些已知信息。 我希望此任务不会阻止我的应用程序的其余响应。 操作过于轻便且频繁,因为它可以作为延迟的工作任务完成。 我想要使​​用: Thread.new do # my logging code end 并称它为一天。 这实现了我想要实现的目标吗? 有什么缺点吗?