Ruby | Introducción a subprocesos múltiples

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *