Hilo :: Queue devuelve nada -- multithreading campo con perl campo con parallel-processing camp Relacionados El problema

Thread::queue return nothing


1
vote

problema

Español

I Trabajo en la secuencia de comandos a continuación en la que dividí el contenido de archivo en tap((result: GetEntitiesResponse) => { 0 e intentando aplicar el hilo :: Queue para acelerar el proceso. Pero el tap((result: GetEntitiesResponse) => { 111 devuelve nada al final. ¿Puedes por favor comprobar qué pasa?

  tap((result: GetEntitiesResponse) => { 2  
Original en ingles

I working on below script in which I split file content in @file_splitted and trying to apply Thread::Queue to speed up the process. But the $result returns nothing at the end. Can you please check what happening?

my $NUM_WORKERS = 5;  my $q = Thread::Queue->new();  sub worker {    my ($job) = @_;     print "@_  \n################\n";    my ($sub_name, @args) = @$job;    my $sub_ref = \&Subroutine;    $sub_ref->(@args); }  {     my $q = Thread::Queue->new();      my @workers;      for (1..$NUM_WORKERS) {         push @workers, async {             while (my $job = $q->dequeue()) {             worker($job); #           print "$job \n";             }         };     }      $q->enqueue($_) for @file_splitted;     $q->end();      for my $t(@workers){         (my @getit)= $t->join();         my $tmp = join '', @getit;          $result .= $tmp;         print "$result\n";     }  } 
        

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

Este aquí está su código actual, pero ordenó un poco y comentó:

  viewDidLayoutSubviews9  

El problema es que en realidad no está devolviendo nada útil desde sus hilos, tenga en cuenta que eliminé el var sundayGradient: CAGradientLayer? 030 subrutina arriba porque no agrega nada a esta discusión, y probablemente confundido usted.

Es muy probable, querrá crear otra cola de la que los hilos pueden devolver los resultados:

  var sundayGradient: CAGradientLayer? 1  

Si solo desea recopilar todos los resultados al final, podría hacer algo así en lugar:

  var sundayGradient: CAGradientLayer? 2  
 

This here is your current code, but tidied up a bit, and commented:

my $NUM_WORKERS = 5;  my $q = Thread::Queue->new();  {     # ok, so here we create a new queue for some reason that shadows the outer $q     my $q = Thread::Queue->new();      my @workers;     for (1 .. $NUM_WORKERS) {         push @workers, async {             while (my $job = $q->dequeue()) {                 my ($sub_name, @args) = @$job; # so the $job is an arrayref                 Subroutine(@args);  # what is "Subroutine"?             }             # this worker does not explicitly return any values         };     }      # what is @file_splitted? Does it contain arrayrefs?     $q->enqueue($_) for @file_splitted;     $q->end();      for my $t (@workers){         # where is $result declared? And why are you using a return value when you         # don't explicitly return anything from your threads?         $result .= join '', $t->join;         print "$result\n";     }  } 

The problem is that you aren't actually returning anything useful from your threads xe2x80x93 note that I removed the worker subroutine above because it doesn't add anything to this discussion, and probably confused you.

Quite likely, you will want to create another queue from which the threads can return results:

my $job_queue = Thread::Queue->new; my $result_queue = Thread::Queue->new; my @workers; for (1 .. $NUM_WORKERS) {     push @workers, async {         while(defined(my $job = $job_queue->dequeue)) {             my $result = Subroutine($job);  # or something like this             $result_queue->enqueue($result);         }         $result_queue->enqueue(undef);     }; }  $job_queue->enqueue(@jobs); $job_queue->end;  my $waiting = $NUM_WORKERS; my @results; while ($waiting) {     if (defined(my $result = $result_queue->dequeue)) {         # do something with the results         push @results, $result;     }     else {         $waiting--;     } }  $_->join for @workers; 

If you only want to collect all results at the end, you could do something like this instead:

my $job_queue = Thread::Queue->new; my $result_queue = Thread::Queue->new; my @workers; for (1 .. $NUM_WORKERS) {     push @workers, async {         while(defined(my $job = $job_queue->dequeue)) {             my $result = Subroutine($job);  # or something like this             $result_queue->enqueue($result);         }     }; }  $job_queue->enqueue(@jobs); $job_queue->end;  $_->join for @workers;  my @results = $result_queue->dequeue($result_queue->pending); 
 
 
   
   

Relacionados problema

1  Agregaciones de hilográficas y tareas de la biblioteca paralela  ( Threadlocal aggregations and task parallel library ) 
¿Por qué obtengo un resultado diferente con las siguientes secciones de código Muestra de código 1 using System; using System.Collections.Generic; using ...

1  Proyecto de procesamiento distribuido "principiante"  ( Beginner distributed processing project ) 
Para el tiempo más largo, he estado interesado en construir un grupo de nodos heterogéneos en un intento por tener una supercomputadora doméstica ya que estoy...

32  ¿Qué tipo de problemas pueden resolver mapreduce?  ( What type of problems can mapreduce solve ) 
¿Hay un análisis teórico disponible que describe qué tipo de problemas se pueden resolver los problemas? ...

1  Las tareas paralelas no funcionan en Ubuntu 12.04 en la estación de trabajo VM  ( Parallel tasks dont work on ubuntu 12 04 in vm workstation ) 
Algo raro está sucediendo en mi máquina virtual que ejecuta Ubuntu 12.04. El siguiente script, que utilicé con éxito antes de ejecutar 7 tareas en 7 núcleos j...

22  ¿Cuáles son las mejores opciones actuales para la paralelización de una aplicación Intensivo de CPU ?NET? [cerrado]  ( What are the current best options for parallelizing a cpu intensive net app ) 
cerrado . Esta pregunta debe ser más enfocado . Actualmente no está aceptando respuestas. ...

3  Cómo paralelizar la integración en Mathematica 8  ( How to parallelize integrating in mathematica 8 ) 
¿Alguien tiene idea de cómo usar todos los núcleos para calcular la integración? Necesito usar la mesa paralelamente o paralela, pero ¿cómo? {True, False, ...

162  ¿Cuál es el estado de la programación multinúcleo en Haskell?  ( Whats the status of multicore programming in haskell ) 
¿Cuál es el estado de la programación multinúcleo en Haskell? ¿Qué proyectos, herramientas y bibliotecas están disponibles ahora? ¿Qué informes de experiencia...

25  MPI para MultiCORE?  ( Mpi for multicore ) 
Con el reciente zumbido en la programación multinúcleo es cualquier persona explorando las posibilidades de usar mpi ? ...

2  Programación paralela en el paradigma funcional  ( Parallel programing in the functional paradigm ) 
He estado escuchando algunos bomlos últimamente sobre el uso de idiomas funcionales para la programación paralela. Estoy interesado en aprender más sobre esto...

3  Cómo escribir el código de ASYNC PHP  ( How to write async php code ) 
Tengo algún código que hace algo como este pseudocodo: Use CURL to get site1 into a variable Use CURL to get site2 into a variable Use CURL to get site3 in...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos