Rails: Sidekiq Workers 必须是线程安全的。这是什么意思?
Rails: Sidekiq Workers must be thread-safe. What Does it mean?
我读了这篇关于 Sidekiq 的文章:
Sidekiq 是多线程的,因此您的 Worker 必须是线程安全的。
这是什么意思? 'thread-safe' 代码是什么?有人可以举个例子吗?非常感谢。
有很多方法可以获得非线程安全代码。这是非线程安全代码的一个示例:
# 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..."
它是线程安全的补充:
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..."
注意,MRI GIL 在解释器级别强制执行一次唯一的线程。但这并不意味着您不会遇到与上述类似的并发问题。 JRuby 和 Rubinius 是 "true" 并发执行环境,但不太常见,正是因为许多库(包括标准库)在重写时应牢记线程安全。
Sidekiq 不对您将在 worker 中使用的库负责,但它 gracefully cautious 您了解使用非线程安全库的后果。
我读了这篇关于 Sidekiq 的文章:
Sidekiq 是多线程的,因此您的 Worker 必须是线程安全的。
这是什么意思? 'thread-safe' 代码是什么?有人可以举个例子吗?非常感谢。
有很多方法可以获得非线程安全代码。这是非线程安全代码的一个示例:
# 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..."
它是线程安全的补充:
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..."
注意,MRI GIL 在解释器级别强制执行一次唯一的线程。但这并不意味着您不会遇到与上述类似的并发问题。 JRuby 和 Rubinius 是 "true" 并发执行环境,但不太常见,正是因为许多库(包括标准库)在重写时应牢记线程安全。
Sidekiq 不对您将在 worker 中使用的库负责,但它 gracefully cautious 您了解使用非线程安全库的后果。