gpt4 book ai didi

ruby-on-rails - Rails : Sidekiq Workers must be thread-safe. 是什么意思?

转载 作者:行者123 更新时间:2023-12-03 13:14:17 26 4
gpt4 key购买 nike

我读到了关于 Sidekiq 的内容:

Sidekiq 是多线程的,因此您的 Workers 必须是线程安全的。

这是什么意思?什么是“线程安全”代码?有人可以举个例子吗?非常感谢。

最佳答案

有很多方法可以获取非线程安全代码。这是非线程安全代码的一个示例:

# 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 是“真正的”并发执行环境,但不太常见,正是因为许多库(包括标准库)在重写时应牢记线程安全。

Sidekiq 不负责您将在 worker 中使用的库,但它 gracefully cautious您了解使用非线程安全库的后果。

关于ruby-on-rails - Rails : Sidekiq Workers must be thread-safe. 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47323609/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com