Multi-threading es la propiedad más útil de Ruby que permite la programación simultánea de dos o más partes del programa para maximizar la utilización de la CPU. Cada parte de un programa se llama Thread . Entonces, en otras palabras, los hilos son procesos ligeros dentro de un proceso. Un programa ordinario contiene un solo hilo y todas las declaraciones o instrucciones se ejecutan secuencialmente. Pero un programa de subprocesos múltiples contiene más de un subproceso y dentro de cada subproceso, las declaraciones o instrucciones se ejecutan secuencialmente, pero el subproceso en sí se ejecuta simultáneamente en el procesador multinúcleo. Los subprocesos múltiples reducen el uso de la memoria en comparación con un solo subproceso al realizar varias tareas. Antes de Ruby 1.9 , los subprocesos se cambiaban dentro del intérprete que se denominan comoHilos Verdes . Pero a partir de Ruby 1.9 en adelante , el subproceso lo realiza el sistema operativo. Los dos subprocesos que se ejecutan en la misma aplicación de Ruby nunca pueden ser realmente concurrentes. En Ruby, se crea un programa de subprocesos múltiples con la ayuda de la clase Thread y se crea un nuevo subproceso llamando a un bloque, es decir, Thread.new .
Crear hilos en Ruby
En Ruby, crear un hilo nuevo es muy fácil. Hay tres bloques ( Thread.new , Thread.start o Thread.fork ) mediante los cuales puede crear un hilo en un programa. Generalmente, Thread.new se usa para crear el hilo. Una vez creado el subproceso, el subproceso original regresará de uno de estos bloques de creación de subprocesos y reanudará la ejecución con la siguiente instrucción.
Sintaxis:
# Original thread is running # creating thread Thread.new { # new thread runs here } # Outside the block # Original thread is running
Ejemplo:
# Ruby program to illustrate # creation of threads #!/usr/bin/ruby # first method def Geeks1 a = 0 while a <= 3 puts "Geeks1: #{a}" # to pause the execution of the current # thread for the specified time sleep(1) # incrementing the value of a a = a + 1 end end # Second method def Geeks2 b = 0 while b <= 3 puts "Geeks2: #{b}" # to pause the execution of the current # thread for the specified time sleep(0.5) # incrementing the value of a b = b + 1 end end # creating thread for first method x = Thread.new{Geeks1()} # creating thread for second method y= Thread.new{Geeks2()} # using Thread.join method to # wait for the first thread # to finish x.join # using Thread.join method to # wait for the second thread # to finish y.join puts "Process End"
Producción:
Geeks1: 0 Geeks2: 0 Geeks2: 1 Geeks1: 1 Geeks2: 2 Geeks2: 3 Geeks1: 2 Geeks1: 3 Process End
Nota: La salida puede ser diferente ya que el sistema operativo asigna los recursos a los subprocesos.
Hilos de terminación
Cuando se termina un programa de Ruby, también se eliminan todos los subprocesos relacionados con ese programa. Un usuario puede matar los hilos usando class ::kill .
Sintaxis:
Thread.kill(thread)
Variables de subproceso y su alcance
Como los hilos están definidos por los bloques, tienen acceso a variables locales, globales y de instancia que están definidas en el alcance del bloque. Las variables presentes en el bloque del subproceso son las variables locales para ese subproceso y ningún otro bloque de subprocesos accede a ellas. La clase de subproceso permite crear y acceder a una variable local de subproceso por su nombre. Si dos o más subprocesos desean leer y escribir la misma variable al mismo tiempo, debe haber sincronización de subprocesos.
Ejemplo:
# Ruby program to illustrate # Thread variables #!/usr/bin/ruby # Global variable $str = "GeeksforGeeks" # first method def Geeks1 # only access by Geeks1 Thread a = 0 while a <= 3 puts "Geeks1: #{a}" # to pause the execution of the current # thread for the specified time sleep(1) # incrementing the value of a a = a + 1 end # accessing str puts "Global variable: #$str" end # Second method def Geeks2 # only access by Geeks2 Thread b = 0 while b <= 3 puts "Geeks2: #{b}" # to pause the execution of the current # thread for the specified time sleep(0.5) # incrementing the value of a b = b + 1 end # accessing str puts "Global variable: #$str" end # creating thread for first method x = Thread.new{Geeks1()} # creating thread for second method y= Thread.new{Geeks2()} # using Thread.join method to # wait for the first thread # to finish x.join # using Thread.join method to # wait for the second thread # to finish y.join puts "Process End"
Producción:
Geeks1: 0 Geeks2: 0 Geeks2: 1 Geeks1: 1 Geeks2: 2 Geeks2: 3 Geeks1: 2 Global variable: GeeksforGeeks Geeks1: 3 Global variable: GeeksforGeeks Process End
Publicación traducida automáticamente
Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA