私は、あまりにも多くの時間を費やしているタスクの並列性を達成するためにマルチスレッドコードを書こうとしています。以下はその外観です:コード内のスレッドの安全性を確認
class A
attr_reader :mutex, :logger
def initialize
@reciever = ZeroMQ::Queue
@sender = ZeroMQ::Queue
@mutex = Mutex.new
@logger = Logger.new('log/test.log')
end
def run
50.times do
Thread.new do
run_parallel(@reciever.get_data)
end
end
end
def run_parallel(data)
## Define some local variables.
a , b = data
## Log some data to file.
logger.info "Got #{a}"
output = B.get_data(b)
## Send output back to zermoq.
mutex.synchronize { @sender.send_data(output} }
end
end
コードがスレッドセーフであることを確認する必要があります。スレッド間でデータを共有したり変更すると(適切なミューテックスがない場合は@
、@@
、$
など)、スレッドの安全性の問題が発生する可能性があります。
データにメソッドを渡すと、スレッドの安全性の問題が発生するかどうかはわかりません。言い換えれば、@
、@@
、$
をメソッド内に使用していない場合は、コード内のrun_parallel
をmutex
にラップする必要がありますか?あるいは、与えられたmutexの定義は十分ですか?
mutex.synchronize { @sender.send_data(output} }
「Logger」はスレッドセーフなので、出力は期待どおりになるはずです。 – coreyward
優秀、ありがとう@coreyward。経験豊かなテストが必要な人は、 'Array.new(500){| i | Thread.new {1000x {| j | Rails.logger.info "#{i} - #{j}"}}}。each(&:join) '。 –