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 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.