Módulo: Mongo::BackgroundThread Privado

Overview

Este módulo es parte de una API privada. Deberías evitar usar este módulo si es posible, ya que puede ser removido o cambiado en el futuro.

Nota:

No inicie ni detenga subprocesos en segundo plano en los finalizadores. Consultar https://jira.mongodb.org/browse/RUBY-2453 y https://bugs.ruby-lang.org/issues/16288. Cuando el interprete sale, los subprocesos en segundo plano se detienen primero y luego se invocan los finalizadores, y las estructuras de datos internas de MRI están básicamente corruptas en este punto si se están refiriendo subprocesos. Antes de que el intérprete se apague, esto significa que los hilos no pueden ser detenidos por objetos que salen del alcance, pero lo más probable es que los hilos tengan referencias a dichos objetos de todos modos si se está realizando trabajo, por lo que los objetos no saldrían del alcance en primer lugar.

¡La ejecución!, ejecutando? ¡y parar! los métodos solían formar parte de la API pública en algunas de las clases que ahora incluyen este módulo. Por lo tanto, estos métodos deben considerarse parte de la API pública del controlador por motivos de compatibilidad con versiones anteriores. Cambiar a utilizar el método getByTestId tal vez puede proporcionar una experiencia de usuario más robusta. Sin embargo, el uso de estos métodos fuera del driver está en desuso.

Resumen constante

Constantes incluidas desde Loggable

Loggable::PREFIX

Resumen del método de instancia colapsar

Métodos incluidos desde Registrable

#log_debug, #log_error, #log_fatal, #log_info, #log_warn, #logger

Detalles del método de instancia

#ejecutar!Objeto

Inicie el hilo de segundo plano.

Si el hilo ya se está ejecutando, este método no hace nada.



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# Archivo 'lib/mongo/background_thread.rb', línea 44

def ejecutar!
  si @solicitud_detencion && @thread
    esperar_detener
    si @thread.alive?
      log_warn("Iniciando un nuevo hilo en segundo plano en #{self}, pero el hilo anterior en segundo plano aún está ejecutándose")
      @thread = nulo
    end
    @solicitud_detencion = false
  end
  si ¿corriendo?
    @thread
  else
    ¡empezar!
  end
end

#en funcionamiento?booleano

Devuelve:

  • (booleano)


61
62
63
64
65
66
67
# Archivo 'lib/mongo/background_thread.rb', línea 61

def ¿corriendo?
  si @thread
    @thread.alive?
  else
    false
  end
end

#¡stop!true | false

Detén el hilo en segundo plano y espera a que termine durante un tiempo prudente.

Devuelve:

  • (true | false)

    Si el hilo fue terminado.



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# Archivo 'lib/mongo/background_thread.rb', línea 75

def ¡detente!
  # Si el hilo no se ha iniciado, no hay nada que detener.
  #
  # Las clases que incluyan este módulo pueden querer realizar operaciones adicionales
  # limpieza, lo cual pueden hacer sobreescribiendo este método.
  return true a menos que @thread

  # Los hilos en segundo plano generalmente realizan operaciones en un bucle.
  # Este indicador está destinado a ser verificado en cada iteración de la
  # bucles de trabajo y el hilo debe dejar de funcionar cuando esta bandera
  # está configurado.
  @solicitud_detencion = true

  # Además de configurar la bandera, una clase en particular puede tener información adicional
  # maneras de indicarle al hilo de segundo plano que deje de funcionar o
  # despertarse para comprobar la bandera de parada, por ejemplo, estableciendo un semáforo.
  # Esto puede lograrse proporcionando el método pre_stop.
  pre_stop

  # Ahora hemos solicitado la terminación elegante, y podríamos esperar
  # para que el hilo salga por su propia cuenta. Una versión futura del
  # el controlador puede permitir una cierta cantidad de tiempo para que el hilo se cierre.
  # Por ahora, además utilizamos la maquinaria de Ruby para solicitar el hilo
  # ser terminados y hacerlo inmediatamente.
  #
  # Ten en cuenta que esto puede causar que el subproceso de segundo plano termine en
  # la mitad de una operación.
  @thread.matar

  esperar_detener
end