Сайт справки
  • Авторизация
  • Обратная связь
  • Теги
    • Joomla
      • JLoader
      • Mootools
      • Bootstrap
      • jQuery
      • jQuery UI
      • Конфликты JS
      • Joomla! Javascript Framework
      • JS Фреймворки
      • Ajax
      • JS
      • MVC
      • JoomShopping
      • Сессии
    • JS

Расширенный поиск
  • Главная
  • Разное
  • PHP
  • Pthreads
  • Класс Worker
  • php
  • Многопоточность
  • pthreads
  • Worker

(PECL pthreads >= 2.0.0)

Введение

Потоки Worker имеют постоянный контекст, поэтому в большинстве случаев их следует использовать поверх классов Threads.

Когда Worker запускается, метод Run будет выполнен, но поток не оставится, пока не будет выполнено одно из следующих условий:

  • Worker выходит за пределы области действия (больше не остается ссылок)

  • программист вызывает завершение работы

  • скрипт завершается

Это означает, что программист может повторно использовать контекст во время выполнения; размещение объектов в стеке Worker приведет к тому, что Worker будет выполнять метод выполнения с накоплением объектов.

Обзор классов

class Worker extends Thread implements Traversable , Countable , ArrayAccess {
	/* Методы */
	public int collect ([ Callable $collector ] )
	public int getStacked ( void )
	public bool isShutdown ( void )
	public bool isWorking ( void )
	public bool shutdown ( void )
	public int stack ( Threaded &$work )
	public int unstack ( void )
	/* Наследуемые методы */
	public void Thread::detach ( void )
	public int Thread::getCreatorId ( void )
	public static Thread Thread::getCurrentThread ( void )
	public static int Thread::getCurrentThreadId ( void )
	public int Thread::getThreadId ( void )
	public static mixed Thread::globally ( void )
	public bool Thread::isJoined ( void )
	public bool Thread::isStarted ( void )
	public bool Thread::join ( void )
	public void Thread::kill ( void )
	public bool Thread::start ([ int $options ] )
}

Существует один способ совместного использования данных между Workers, то есть с помощью Stackable:

<?php
class data extends Stackable{
    //private $name;
    public function __construct($_name) {
        //$this->name = $_name;//если вы установите любую переменную, работники получат переменную, поэтому не устанавливайте никакой переменной
        echo __FILE__.'-'.__LINE__.'<br/>'.chr(10);
    }
    public function run(){
        echo __FILE__.'-'.__LINE__.'<br/>'.chr(10);
    }
}
class readWorker extends Worker {
    public function __construct(&$_data) {
        $this->data = $_data;//
    }
    public function run(){
        while(1){
            if($arr=$this->data->shift())//receiving datas
            {
                echo 'Received data:'.print_r($arr,1).chr(10);
            }else usleep(50000);
        }
    }
}
class writeWorker extends Worker {
    public function __construct(&$_data) {
        $this->data = $_data;//
    }
    public function run(){
        while(1){
            $this->data[] = array(time(),rand());//запись данных
            usleep(rand(50000, 1000000));
        }
    }

}
$data = new data('');
$reader = new readWorker($data);
$writer = new writeWorker($data);
$reader->start();
$writer->start();
?>

Также вы можете использовать $readWorker[] = $some_data; затем используйте $this->shift() в readWorker, чтобы поделиться данными с readWorker, но если вы это сделаете, у вас не будет переменных в readWorker, так как все переменные будут сдвинуты на shift();

Содержание

Worker::collect — Сбор ссылок на выполненные задачи
Worker::getStacked — Возвращает оставшийся размер стека
Worker::isShutdown — Обнаружение Состояния
Worker::isWorking — Обнаружение состояний
Worker::shutdown — Завершение работы worker
Worker::stack — Добавить задание в стек
Worker::unstack — Удаление работы

  • Карта сайта

Наверх

© Сайт справки 2025

Яндекс.Метрика