Tag: multithreading

即使只有一个线程在线程池中,并发会发生并发吗?

我正在使用Rails 5和Ruby 2.4。 我怎么能弄明白,或者你能看出下面的内容,是否有多个线程在同一时间运行? pool = Concurrent::FixedThreadPool.new(1) promises = links.map do |link| Concurrent::Promise.execute(executor: pool) do result = process_link(link) if result if result.kind_of?(Array) result.each do |my_obj| my_obj.update_attributes({ :a => a }) records_processed = records_processed + my_obj.matches.count end else records_processed = records_processed + result.matches.count result.update_attributes({ :a => a }) end end end end promises.map(&:wait).map(&:value!) 由于我已将我的池设置为“1”,我的假设是没有任何内容同时运行,但我一直收到此错误… Error during […]

Ruby线程是否安全?

我在控制台中运行了以下代码超过10次,结果输出相同,为100000 。 i = 0 1000.times do Thread.start { 100.times { i += 1 } } end i 它不应该给我不同的输出,因为我正在阅读和更新i ,使用多个线程。 它让我想知道,默认情况下ruby实际上是线程安全的吗? 如果没有,那为什么我总是看到相同的输出? ps如果你说,默认情况下它不是线程安全的,你可以分享一个简单的例子,当我在rails console中运行时会给我不同的结果吗? 编辑: 换句话说,上面的代码是同时运行1000个线程吗? 如果是,则结果不应总是 100000 。 如果没有,那么如何同时运行多个线程? 如果我添加puts ,那么i打印顺序将会改变。 它意味着线程彼此交错,但它们是否同时运行? 我不是问,如何使这个线程安全。 我理解mutex / locking和同步/异步过程的概念。 因为我理解它们,所以我无法理解这段代码的输出。

Ruby – 不可变对象

我有一个用Ruby编写的高度multithreading的应用程序,它共享一些实例变量。 写入这些变量很少(1%),而读取非常常见(99%)。 什么是最好的方式(在您看来或以惯用的Ruby方式)确保这些线程始终能够看到最新的值? 到目前为止,我有一些想法(尽管在我检修之前我想要你的意见): 在读取或写入任何这些变量之前,请使用最常用的锁(来自Java Concurrency in Practice )。 这样做的缺点是它在我的代码中放了很多synchronize块,我没有看到一种简单的方法来避免它。 使用Ruby的freeze方法(见这里 ),虽然它看起来同样麻烦,并没有给我任何第一个选项带来的同步好处。 这些选项看起来都非常相似,但希望那里的任何人都会有更好的想法(或者可以为其中一个想法辩护)。 我也可以将对象变为不可变,因此它们在操作过程中不会被破坏或改变,但是我不太了解Ruby以便自己调用这个问题似乎在争论对象是高度可变的。

在同一脚本中启动并调用Ruby HTTP服务器

我想知道如何启动Ruby Rack应用程序(例如Sinatra)并在同一脚本中使用Net :: HTTP或类似方法调用它。 我可以做点什么…… require ‘sinatra/base’ require ‘net/http’ t = Thread.new do class App ‘localhost’, :port => 1234 end sleep 2 puts Net::HTTP.start(‘localhost’, 1234) { |http| http.get(‘/’) }.body t.join puts ‘Bye!’ …但是,等待Thin启动时,睡眠两秒钟并不是最佳选择。 我需要的是当服务器启动时或某人有任何其他建议时的某种回调?

如何从ruby线程获取错误消息

我现在遇到了一个问题,我无法看到我的子线程在哪里吐出错误消息,这使得调试变得困难。 例如: Thread.new{ a = 1/0 } 有什么方法可以在stderr打印出所有线程错误吗?

Ruby:用于线程池的任何gem?

是否有任何人可以推荐的线程gem?

Ruby的stdlib Logger类是线程安全的吗?

简而言之,Ruby中的标准库Logger类是否是线程安全的? 谷歌出现的唯一有用信息是论坛上有人说它“似乎”是线程安全的。 而且我不想花时间测试记录器来试图弄清楚它是否存在。 暂时我使用的是log4r ,它是线程安全的,但是如果标准库已经这样做了就太过分了。

用MRI产生竞争条件

我想知道使用MRI ruby​​(2.0.0)和一些全局变量来制作竞争条件是否容易,但事实certificate这并不容易。 看起来它应该在某些时候失败,但它没有,我已经运行了10分钟。 这是我一直试图实现的代码: def inc(*) a = $x a += 1 a *= 3000 a /= 3000 $x = a end THREADS = 10 COUNT = 5000 loop do $x = 1 THREADS.times.map do Thread.new { COUNT.times(&method(:inc)) } end.each(&:join) break puts “woo hoo!” if $x != THREADS * COUNT + 1 end puts $x […]

Ruby – 如何跨核心/处理器进行线程化

我(重新)在ruby中编写套接字服务器以期简化它。 阅读ruby套接字我跑过一个网站 ,说multithreadingruby应用只在一台机器上使用一个核心/处理器。 问题: 这准确吗? 我关心的? 此服务器中的每个线程可能会运行几分钟,并且会有很multithreading。 操作系统(CentOS 6.5)是否足够智能以共享负载? 这与C ++中的线程有什么不同? (当前套接字服务器的语言)IE做pthreads自动使用多个核心? 如果我而不是线程怎么办?

Ruby中的线程安全枚举器

TLDR:Ruby中是否有一个线程安全的Enumerator类版本? 我想做什么: 我在Ruby On Rails应用程序中有一个方法,我希望同时运行。 该方法应该创建一个包含来自站点的报告的zip文件,其中zip中的每个文件都是PDF。 从html到PDF的转换有点慢,因此需要multithreading。 我的期望如何: 我想使用5个线程,所以我想我会在线程之间有一个共享的枚举器。 每个线程都会从Enumerator中弹出一个值,并运行do stuff。 以下是我认为它会起作用的方式: t = Zip::OutputStream::write_buffer do |z| mutex = Mutex.new gen = Enumerator.new{ |g| Report.all.includes(“employee” => [“boss”, “client”], “projects” => {“project_owner” => [“project_team”]}).find_each do |report| g.yield report end } 5.times.map { Thread.new do begin loop do mutex.synchronize do @report = gen.next end title = @report.title […]