Ich versuche, einen Multi-Threaded-Code zu schreiben, um Parallelität für eine Aufgabe zu erreichen, die zu viel Zeit in Anspruch nimmt. Hier ist, wie es aussieht:Stellen Sie Thread-Sicherheit im Code
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
Man muss sicherstellen, dass der Code Thread sicher ist. Teilen und Ändern von Daten (wie @
, @@
, $
ohne ordnungsgemäße Mutex) über Threads könnte zu Thread Sicherheitsproblem führen.
Ich bin mir nicht sicher, ob, wenn ich die Daten an eine Methode übergebe, die Threadsicherheitsproblem ebenso ergibt. Mit anderen Worten, muss ich sicherstellen, dass der Teil meines Codes innerhalb run_parallel
in eine mutex
gewickelt werden muss, wenn ich keine @
, @@
, $
innerhalb der Methode verwende? Oder ist die angegebene Mutex-Definition ausreichend?
mutex.synchronize { @sender.send_data(output} }
Für was es wert ist, 'Logger' ist Threadssafe, so sollte die Ausgabe wie erwartet sein. – coreyward
Ausgezeichnet, danke @coreyward. Wenn jemand einen schnellen empirischen Test wünscht, 'Array.new (500) {| i | Thread.new {1000.x {| j | Rails.logger.info "# {i} - # {j}"}}}. Jedes (&: join) '. –