Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

139
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda