PHP pthreads v3 에서 worker 와 pool 의 사용 방법 예시

7027 단어 PHPpthreadsworkerpool
이 사례 는 PHP pthreads v3 에서 worker 와 pool 의 사용 방법 을 설명 한다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
어떤 사람들 은 분명히 thread 를 사용 하면 이미 좋 은 일 을 할 수 있 는데 왜 worker 와 pool 을 만 들 려 고 합 니까?
워 커 와 pool 을 사용 하 는 이 유 는 효율 때 문 입 니 다.시스템 이 새로운 라인 을 만 드 는 대가 가 비교적 비 싸 기 때문에 만 든 스 레 드 마다 현재 실 행 된 전체 컨 텍스트 를 복사 합 니 다.
가능 한 한 스 레 드 를 재 활용 하면 우리 의 프로그램 을 더욱 효율 적 으로 할 수 있다.
간단 한 워 커 예:

<?php
//     work , work    ,    
class Work extends Worker
{
  private $name;

  public function __construct($name)
  {
    $this->name = $name;
  }

  public function getName()
  {
    return $this->name;
  }
}

class Task extends Thread
{
  private $num;

  public function __construct($num)
  {
    $this->num = $num;
  }

  public function run()
  {
    //     
    $total = 0;
    for ($i = 0; $i < $this->num; $i++) {
      $total += $i;
    }
    echo "work : {$this->worker->getName()} task : {$total} 
"; sleep(1); } } // worker $work = new Work('a'); $work->start(); for ($i = 1; $i <= 10; $i++) { // Task worker // Task worker ( , ) $work->stack(new Task($i)); } // , , while ($work->collect()) ; // worker $work->shutdown();
위의 코드 가 실 행 될 때 계산 결 과 는 1 초 마다 하나씩 나 옵 니 다.즉,10 개의 task 대상 은 1 개의 worker 스 레 드 에서 실 행 됩 니 다.
만약 10 개의 task 대상 이 각각 독립 된 공간 에서 운행 된다 면 sleep()함 수 는 작용 하지 않 을 것 이 며,그들 각자 sleep 는 다른 라인 에 영향 을 주지 않 을 것 이다.

위의 코드 를 수정 하 세 요.

<?php
//     work , work    ,    
class Work extends Worker
{
  private $name;

  public function __construct($name)
  {
    $this->name = $name;
  }

  public function getName()
  {
    return $this->name;
  }
}

class Task extends Thread
{
  private $num;

  public function __construct($num)
  {
    $this->num = $num;
  }

  public function run()
  {
    //     
    $total = 0;
    for ($i = 0; $i < $this->num; $i++) {
      $total += $i;
    }
    echo "work : {$this->worker->getName()} task : {$total} 
"; sleep(1); } } // worker $work1 = new Work('a'); $work2 = new Work('b'); $work1->start(); $work2->start(); for ($i = 1; $i <= 10; $i++) { if ($i <= 5) { $work1->stack(new Task($i)); } else { $work2->stack(new Task($i)); } } // , , while ($work1->collect() || $work2->collect()) ; // worker $work1->shutdown(); $work2->shutdown();
여기 서 우 리 는 워 커 스 레 드 2 개 를 만 들 고 10 개의 task 대상 을 각각 2 개의 워 커 에 저장 합 니 다.
이때 계산 결 과 는 1 대 1 로 나 온 것 으로 10 개의 task 대상 이 2 개의 worker 스 레 드 에서 달 렸 다 는 것 을 알 수 있다.

몇 개의 워 커 스 레 드 와 몇 개의 task 대상 을 만들어 야 하 는 지 는 자신의 요구 에 달 려 있 습 니 다.
워 커 의 또 다른 장점 은 워 커 의 대상 과 방법 을 다시 사용 할 수 있다 는 것 이다.우 리 는 worker 에서 데이터베이스 연결 대상 을 만들어 서 각 task 호출 을 편리 하 게 할 수 있 습 니 다.

<?php
class DB extends Worker
{
  //           ,pdo               
  //       ,   worker    pdo  
  private static $db = null;
  public $msg = 'i from db';

  public function run()
  {
    self::$db = new PDO('mysql:host=192.168.33.226;port=3306;dbname=test;charset=utf8', 'root', '');
  }

  public function getDb()
  {
    return self::$db;
  }
}

class Task extends Thread
{
  private $id;
  //  ,            ,$result            ,     
  private $result;

  public function __construct($id)
  {
    $this->id = $id;
  }

  public function run()
  {
    //  worker       
    $db = $this->worker->getDb();
    $ret = $db->query("select * from tb_user where id = {$this->id}");
    $this->result = $ret->fetch(PDO::FETCH_ASSOC);
    //  worker      msg
    echo "data : {$this->result['id']} {$this->result['name']} \t worker data : {$this->worker->msg} 
"; } } // worker $work = new DB(); $work->start(); for ($i = 1; $i <= 5; $i++) { $work->stack(new Task($i)); } // , , while ($work->collect()) ; // worker $work->shutdown();
tb_user 표 는 마음대로 만 들 수 있 습 니 다.저 는 프레젠테이션 을 위해 id 와 name 필드 만 만 만 들 었 습 니 다.
실행 결 과 는 다음 과 같 습 니 다.

 
워 커 가 스 레 드 에 대한 재 활용 이 라면 pool 은 워 커 에 대한 추상 적 이 고 여러 워 커 를 동시에 관리 할 수 있 습 니 다.

<?php
//        Id   ,      work     ID,    ,  task      work 
class Id extends Thread
{
  private $id;

  public function getId()
  {
    //    id  ,        
    $this->synchronized(function () {
      ++$this->id;
    });
    return $this->id;
  }
}

class Work extends Worker
{
  private $id;

  public function __construct(Id $obj)
  {
    $this->id = $obj->getId();
  }

  public function getId()
  {
    return $this->id;
  }
}

class Task extends Thread
{
  private $num = 0;

  public function __construct($num)
  {
    $this->num = $num;
  }

  //     
  public function run()
  {
    $total = 0;
    for ($i = 0; $i < $this->num; $i++) {
      $total += $i;
    }
    echo "work id : {$this->worker->getId()} task : {$total} 
"; } } // pool, 3 work $pool = new Pool(3, 'Work', [new Id()]); // 20 task pool work for ($i = 1; $i <= 20; $i++) { $pool->submit(new Task($i)); } // , , while ($pool->collect()) ; // pool $pool->shutdown();
실행 결 과 는 다음 과 같 습 니 다.

더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기