Módulo: Mongo::BackgroundThread Privado

Incluye:
Registrable
Incluido en:
Clúster::Ejecutor periódico, Servidor::Grupo de conexiones::Rellenador, Servidor::Monitor,Servidor::Monitor deinserción, Srv::Monitor
Definido en:
lib/mongo/background_thread.rb

Overview

Este módulo forma parte de una API privada. Debe evitar su uso siempre que sea posible, ya que podría eliminarse o modificarse en el futuro.

Nota:

No inicie ni detenga hilos en segundo plano en finalizadores. Consulta jira.mongodb.org/browse/RUBY-2453 y bugs.ruby-lang.org/issues/16288. Cuando el intérprete sale, primero se detienen los hilos en segundo plano y el siguiente se invocan los finalizadores, y las estructuras de datos internas de MRI están básicamente corruptas en este punto si se están referenciando hilos. Antes de la terminación del intérprete, esto significa que los hilos no pueden detenerse por objetos que salen del alcance, pero lo más probable es que los hilos mantengan referencias a dichos objetos de todos modos si se está realizando algún trabajo, por lo que los objetos no saldrían del alcance en primer lugar.

¡La ejecución!, ¿ejecutando? y ¡detente! los métodos solían ser 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 razones de retrocompatibilidad. Sin embargo, se considera deprecated el uso de estos métodos fuera del driver.

Resumen constante

Constantes incluidas desde Loggable

Registrable::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.



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

def ejecutar!
  si @solicitud_detencion && @thread
    esperar_detener
    si @thread.alive?
      advertencia de registro("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 ¿correr?
    @thread
  else
    ¡empezar!
  end
end

#en funcionamiento?booleano

Devuelve:

  • (booleano)


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

def ¿correr?
  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.



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
106
107
# Archivo 'lib/mongo/background_thread.rb', línea 77

def ¡detener!
  # 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á establecido.
  @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 sí solo. 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.
  #
  # Tenga en cuenta que esto puede provocar que el hilo en segundo plano finalice en
  #en medio de una operación.
  @thread.matar

  esperar_detener
end