Clicky

Skocz do zawartości


Zdjęcie
- - - - -

Tworzenie nowego wątku w Kohana

Brak odpowiedzi do tego tematu
thread threading multithreading pthreads wielowątkowość Kohana PHP

  • Zaloguj się, aby dodać odpowiedź

#1 lierizou

lierizou

    Początkujący

  • Użytkownik
  • Pip
  • 1 postów

Napisano 06 lipiec 2014 - 18:55

Hej,

 

Mam problem z połączeniem wielowątkowości pthreads z Kohaną.

Tworzę stronę, na której obliczenia chciałbym przeprowadzać "w tle". Niezależnie od tego, czy pojawił się jakikolwiek request, chciałbym co sekundę wykonywać daną logikę obliczającą dane do wyświetlenia przez użytkownika. Przypuszczam że cron w tym przypadku się niezbyt sprawdzi, więc postanowiłem zaimplementować osobny wątek, który będzie wykonywał obliczenia.

 

Stworzyłem prostą klasę implementującą wątek:

class TempThread extends Thread
{
  public function __construct($i){
    $this->i=$i;
  }

  public function run(){
    $counter = 0;
    while($counter < 5){
      echo $this->i;
      $counter++;
      sleep(1);
    }
  }
}

Wątek wykonuję w widoku:

<?php
  for($i=0;$i<5;$i++){
    $workers[$i] = new TempThread($i);
    $workers[$i]->start();
  }
?>

W rezultacie na ekranie otrzymuję ciąg znaków "0000011111222223333344444" (wątki wykonały się), jednak otrzymuję również błąd:

Fatal error: Uncaught exception 'ErrorException' with message '(Registered shutdown functions) Unable to call Array() - function does not exist' in Unknown:0 Stack trace: #0 [internal function]: Kohana_Core::error_handler(2, '(Registered shu...', 'Unknown', 0, Array) #1 {main} thrown in Unknown on line 0

Próbowałem również przenieść wywołanie wątku z widoku do kontrolera. Serwer wciąż zwraca mi poprawne "0000011111222223333344444", lecz zwraca inny błąd:

ErrorException [ Fatal Error ]: Call to a member function quote_column() on a non-object
MODPATH\orm\classes\Kohana\ORM.php [ 1647 ]
1642   }
1643 
1644   $this->_build(Database::SELECT);
1645 
1646   $records = $this->_db_builder->from(array($this->_table_name, $this->_object_name))
1647    ->select(array(DB::expr('COUNT('.$this->_db->quote_column($this->_object_name.'.'.$this->_primary_key).')'), 'records_found'))
1648    ->execute($this->_db)
1649    ->get('records_found');
1650 
1651   // Add back in selected columns
1652   $this->_db_pending += $selects;
{PHP internal call} » Kohana_Core::shutdown_handler()

Czy możliwe jest odpalenie osobnego wątku w Kohana? Dlaczego wątek główny radzi sobie z zarejestrowaniem funkcji za pomocą "register_shutdown_function(array)", a stworzony przeze mnie wątek nie potrafi nawet zainicjalizować tablicy? I czy "$this->_db" zostało już usunięte? Czy na początku nowego wątku powinienem ręcznie inicjalizować moduły Kohany, takie jak ORM?

Kod testowałem bez frameworka, otrzymałem "0000011111222223333344444" bez błędów.

Używam frameworka Kohana w wersji 3.3.1, wersja PHP to 5.5.11

 

Z góry dzięki za pomoc







Również z jednym lub większą ilością słów kluczowych: thread, threading, multithreading, pthreads, wielowątkowość, Kohana, PHP

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych