„In der Informatik ein Thread einer Ausführung ist die kleinste Sequenz programmierter Befehle, die unabhängig von einem Betriebssystem-Scheduler verwaltet werden können. Ein Thread ist ein leichtgewichtiger Prozess.“
irb(main):001:0> def calculate_sum(arr)
irb(main):002:1> sleep(2)
irb(main):003:1> sum = 0
irb(main):004:1> arr.each do |item|
irb(main):005:2* sum += item
irb(main):006:2> end
irb(main):007:1> sum
irb(main):008:1> end
=> :calculate_sum
irb(main):009:0>
irb(main):010:0* @items1 = [12, 34, 55]
=> [12, 34, 55]
irb(main):011:0> @items2 = [45, 90, 2]
=> [45, 90, 2]
irb(main):012:0> @items3 = [99, 22, 31]
=> [99, 22, 31]
irb(main):013:0>
irb(main):014:0* threads = (1..3).map do |i|
irb(main):015:1* Thread.new(i) do |i|
irb(main):016:2* items = instance_variable_get("@items#{i}")
irb(main):017:2> puts "items#{i} = #{calculate_sum(items)}"
irb(main):018:2> end
irb(main):019:1> end
=> [#<Thread:[email protected](irb):15 run>, #<Thread:[email protected](irb):15 run>, #<Thread:[email protected](irb):15 run>]
irb(main):020:0> threads.each {|t| t.join}
items3 = 152
items2 = 137
items1 = 101
=> [#<Thread:[email protected](irb):15 dead>, #<Thread:[email protected](irb):15 dead>, #<Thread:[email protected](irb):15 dead>]
irb(main):021:0>
Dies ist ein grundlegendes Beispiel für das Einfädeln eines Prozesses in Ruby. Sie haben die Hauptmethode calculate_sum
, die ein Array als Argument @item1, @item2, @item3
nimmt. Von dort aus machen Sie drei Threads threads = (1..3)
ordnen sie in ihre eigene Variable .map do |i|
und starten Sie eine neue Thread
Instanz mit der Variablen, die der Thread zugeordnet wurde, Thread.start(i)
.
Von hier aus erstellen Sie eine Elementvariable, die der Instanzvariable items = instance_variable_get(<object>)
entspricht. Geben Sie das Ergebnis der Berechnungen aus. Wie Sie sehen können, beginnen die Threads gleichzeitig => [#<Thread:[email protected](irb):15 run>, #<Thread:[email protected](irb):15 run>, #<Thread:[email protected](irb):15 run>]
. Die Threads werden alle ausgeführt, indem jeder Thread aufgerufen und mit ihnen verbunden wird threads.each {|t| t,join}
.
Der letzte Abschnitt ist der wichtigste, die Threads werden alle ausgeführt und sterben gleichzeitig, aber wenn ein Thread einen sehr langen Prozess hat, muss der Thread enden, bevor das Programm beendet wird. Beispiel:
irb(main):023:0> Thread.new do
irb(main):024:1* puts t
irb(main):025:1> Thread.new do
irb(main):026:2* sleep(5)
irb(main):027:2> puts h
irb(main):028:2> end
irb(main):029:1> end
=> #<Thread:[email protected](irb):23 run>
irb(main):030:0> hello
goodbye
Der zweite Thread wird nie beendet, daher wird der Prozess solange ausgeführt, bis Sie die Ausführung abbrechen.
Im Hauptbeispiel hat das Ende => [#<Thread:[email protected](irb):15 dead>, #<Thread:[email protected](irb):15 dead>, #<Thread:[email protected](irb):15 dead>]
, weil alle Threads den Prozess beenden und sofort beenden. Damit mein Prozess fertig ist, müssten Sie einen 10 für den zweiten Thread bereitstellen.
Ich hoffe, das beantwortet Ihre Fragen.
Was meinst du damit ist threadsicher, Ruby hätte keine 'Thread' Funktion wenn es nicht sicher wäre Thread mit ..? – 13aal
Ich meinte, wenn ich eine lokale Variable in mehreren Threads lese und aktualisiere, sollte sich das Ergebnis nicht unterscheiden? – Abhishek
Ich frage mich, wie die Reihenfolge der Anwendung der atomaren 'succ'-Operation auf' Integer' das Ergebnis beeinflussen könnte? – mudasobwa