为什么JRuby在从线程内部调用“Puts”时,有时不在字符串末尾打印换行符?

jv4diomz  于 2022-09-21  发布在  Ruby
关注(0)|答案(0)|浏览(119)

在Ruby中,我习惯于看到puts总是在打印字符串之前在其后面附加一个换行符。

在Ruby中使用多线程,包括使用JRuby运行它时,我注意到一些奇怪的行为。有时,两行会打印在同一行上,而不是像我预期的那样打印在单独的行上。在我第一次尝试时,我的脚本使用的是并发ruby中的Semaphore,因为我正在测试并发和并行模式。我使用信号量一次只允许启动配置数量的线程。这种情况发生的可能性约为20%。

为了为Stack Overflow创建最小的复制,我去掉了并发Ruby并创建了我的程序的一个较小版本,它只创建立即运行的线程,而不需要首先将代码块存储在pros中,也不使用信号量。在这个新程序中,这个问题100%都会发生(至少到目前为止我已经尝试运行了多少次)。

我知道,对于多线程,每次打印两行的顺序可能不同,这取决于哪个线程首先运行。但我没有想到,有时应该在每个打印的字符串末尾的换行符(因为我用puts打印它们)有时会不在那里。

计划:

def work(n)
  puts "Started unit of work ##{n}."
  i = 0
  100000000.times { i += 1 }
  puts "Finished unit of work ##{n}."
end

threads = []

2.times do |i|
  thread = Thread.new do
    work(i + 1)
  end
  threads << thread
end

threads.each do |t|
  t.join
end

puts "nEnd."

产出:

Started unit of work #1.Started unit of work #2.

Finished unit of work #2.
Finished unit of work #1.

End.

注意输出如何包括Started unit of work #1.Started unit of work #2.而不是Started unit of work #1.\nStarted unit of work #2.。还要注意,对于每个线程中对puts的第二次调用,这个问题不会发生。不出所料,这些都在不同的线路上。

每次我用JRuby运行Ruby脚本时,这个输出都是一致的。我无法运行它在Started unit of work #1.Started unit of work #2.之后打印换行符。

系统详细信息:

> jruby --version
jruby 9.3.8.0 (2.6.8) 2022-09-13 98d69c9461 OpenJDK 64-Bit Server VM 19+36-2238 on 19+36-2238 +jit [x86_64-linux]
> java --version
openjdk 19 2022-09-20
OpenJDK Runtime Environment (build 19+36-2238)
OpenJDK 64-Bit Server VM (build 19+36-2238, mixed mode, sharing)
> lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04
Codename:       jammy

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题