2014-01-30 3 views
0

Я хочу реализовать многопоточность в моем коде, чтобы сократить время. Я выполнил Thread :: Queue, но я получаю ошибку. Потому что код содержит SQL-запросы. Я не могу получить доступ к базе данных через поток одновременно.Реализация многопоточности в коде содержит вызовы SQL

sub worker{ 
    while($q->queue){ 
if (exists $href->{$issue}->{'parent'}) { 
     foreach my $parent (sort keys %{$href->{$issue}->{'ddts_parent'}}) { 
     my $sql_dest1 ="select pkey from jiraissue where ID=(Select Query')"; 
      my $sth_dest1 = $dbh->prepare($sql_dest1); 
      $sth_dest1->execute(); 

      foreach (my $dest_array = $sth_dest1->fetchrow_array) { 
       if ($dest_array ne '') { 
------------some code here------------------------------ 
         #to retain link between projects and delete Active url. 
         my $remote_key=$dbh->selectrow_array("select Query)"); 
         my $temp_ddtsid=$dbh->selectrow_array("select Query')"); 
          $jira->update_issue($remote_key,$update); 
         } 
       } 
       else { 
         $jira->update_issue($src_issue,$update); 
        } 
       }   
      } 
     }  
    } 
    if (exists $href->{$src_issue}->{'ddts_child'}) { 
     foreach my $ddts_child (sort keys %{$href->{$src_issue}->{'ddts_child'}}) { 
      my $sql_dest ="select Query')";   
      my $sth_dest = $dbh->prepare($sql_dest); 
      $sth_dest->execute(); 


      foreach (my $dest_array = $sth_dest->fetchrow_array) { 
       if ($dest_array ne '') { 

          $jira->update_issue($src_issue,$update); 
         } 
         #to retain link between projects and delete Active url. 
         my $remote_key=$dbh->selectrow_array("select Query"); 
        my $temp_ddtsid=$dbh->selectrow_array("select Query"); 

     } 
    } 

, пожалуйста, дайте мне решение, как реализовать многопоточность и семафор.

ответ

1

От Threads and Thread Safety in the DBI documentation, курсив мой:

[Когда новый поток создается, весь интерпретатор со всеми его данными клонируют.]

Однако внутренние данные указателя внутри ручки будут ссылаться к DBI и драйверам в оригинальном интерпретаторе. Использование этих дескрипторов в новом потоке интерпретатора небезопасно, поэтому DBI обнаруживает это и кричит по любому вызову метода, используя дескрипторы, которые не относятся к текущему потоку (кроме DESTROY).

Из-за этого (возможно, временного) ограничения только что созданные потоки должны сделать свои собственные подключения к базе данных. Ручки не могут использоваться совместно нитями.

Но берегитесь, некоторые API, лежащий в основе базы данных (код драйвер DBD использует, чтобы говорить с базой данных, часто предоставленной поставщиком базы данных) не являются поточно. Если он не является потокобезопасным, то одновременное включение нескольких потоков для ввода кода может привести к возникновению тонких/серьезных проблем. В некоторых случаях, позволяя более чем одному потоку вводить код, даже если не в одно и то же время, может вызвать проблемы. Вы были предупреждены.

Использование DBI с потоками perl пока не рекомендуется для производственных сред. Для получения дополнительной информации см http://www.perlmonks.org/index.pl?node_id=288022

Резюмируя:

  • В принципе, DBI может работать в многопоточной среде, до тех пор, как основной драйвер потокобезопасен а.
  • Вы должны создать новое соединение для каждого потока. Соединения, дескрипторы дескрипторов и обработчики результатов не могут быть разделены между потоками.
+0

Спасибо amon ... Можем ли мы использовать Thread :: семафор для обработки этих запросов базы данных для выполнения одного из них после другого? Если возможно, дайте пример примера. Как реализовать семафор. пожалуйста, –

+0

@ user3177669 Да, конечно, мы можем использовать 'Thread :: Semaphore' здесь, но это не полезно: создать новое соединение с базой данных внутри каждого потока. Затем каждый поток может выполнять запросы параллельно. База данных отвечает за упорядочение запросов, а не от вашего кода. Тем не менее, я был бы удивлен, если бы резьбовое решение было быстрее, чем не-резьбовое решение здесь. – amon

+0

скажите мне другое решение для этого ... Я сократил время, пожалуйста. –

Смежные вопросы