Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

137
Vistas
Los rieles cuelgan en Thread

Estoy tratando de hacer que una parte de un solo subproceso sea multiproceso. El código de subproceso único inicial funciona bien, pero después de colocarlo en un subproceso, el servidor se bloquea sin ninguna información de registro en la consola.

Versión inicial:

 data_array.each do |data| service = SomeService.new(data) data['answers'] = service.answer_data end

Versión de subprocesos múltiples:

 threads = [] threads << Thread.new { data_array.each do |data| service = SomeService.new(data) data['answers'] = service.answer_data end } threads.each(&:join)

Intenté binding.pry y obtuve más información:

  1. Tengo una Class llamada AggregationReport < Report
  2. Cuando SomeService intentó ejecutar AggregationReport.new , quedó atascado allí para siempre.

Por favor, ayúdame a entender lo que está sucediendo aquí, ¡cualquier idea/ayuda sería muy apreciada!


Versión Ruby: Ruby27x Rieles: 5.2

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Estoy haciendo algunas suposiciones sobre por qué está enhebrando esto, pero esperaría que el código de enhebrado típico siga la siguiente estructura básica:

 threads = data_array.map do |data| Thread.new { SomeService.new(data).answer_data } end answers = threads.map(&:value)

Para cada pieza de trabajo que necesita hacer:

  1. Cree un subproceso que haga el trabajo y almacene el resultado de forma segura para subprocesos
  2. Únase a cada subproceso para garantizar la ejecución (esto se maneja con #value)
  3. Recoge los resultados

Si su servicio necesita una conexión a la base de datos (p. ej., postgres, redis, etc.), también deberá administrarla. Para activerecord, agregue ActiveRecord::Base.with_connection{ } dentro del hilo para asignar una conexión db. Hay enfoques similares para Redis/etc. Luego, asegúrese de tener suficientes conexiones para el número de subprocesos que desea crear (mire el pool: configuración en config/database.yml ).

 Thread.new { ActiveRecord::Base.with_connection{ SomeService.new(data).answer_data } }

Por esta y otras razones, no siempre es una buena idea generar N subprocesos, por lo que en lugar de este enfoque, puede considerar usar un grupo de subprocesos de X y asegurarse de tener un grupo de conexiones de base de datos de al menos X + 1 conexiones. Todo esto puede ser complejo. Hay grandes gemas que se asientan sobre el enhebrado de rubí y hacen que sea más fácil hacer exactamente este tipo de cosas. Recomiendo encarecidamente comprobar concurrent-ruby (incluido con Rails).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda