rod*_*rod 0 ruby model-view-controller multithreading ruby-on-rails sidekiq
我读到有关Sidekiq的内容:
Sidekiq是多线程的,因此您的工作线程必须是线程安全的。
这是什么意思?什么是“线程安全”代码?有人可以举例说明吗?非常感谢你。
有很多可能的方法来获取非线程安全的代码。这是非线程安全代码的一个示例:
# shared resource
$resource = StringIO.new
class NonThreadSafeWorker
include Sidekiq::Worker
def perform(_)
random_letter = ('a'..'z').to_a.sample
# concurrency problem: data race
100_000.times do
$resource.write random_letter
end
end
end
# Suppose you run 2 workers, result might be the next: "aaaabbabbabba..."
Run Code Online (Sandbox Code Playgroud)
它是线程安全的补充:
require 'thread'
mutex = Mutex.new
class ThreadSafeWorker
include Sidekiq::Worker
def perform(_)
random_letter = ('a'..'z').to_a.sample
mutex.synchronize do
# synchronize access to shared resource
100_000.times do
$resource.write random_letter
end
end
end
end
# Suppose you run 2 workers, result must be the next: "aaaaaaa...bbbbbb..."
Run Code Online (Sandbox Code Playgroud)
请注意,MRI GIL在解释程序级别一次强制执行仅一个线程。但这并不意味着您不会遇到与上述类似的并发问题。JRuby和Rubinius是“真正的”并发执行环境,但不太常见,这恰恰是因为许多库(包括标准库)在编写时应牢记线程安全。
Sidekiq对您将在worker内部使用的库不承担任何责任,但是请谨慎地了解使用非线程安全库的后果。
| 归档时间: |
|
| 查看次数: |
858 次 |
| 最近记录: |