PHP pthread 확장 사용법과 함정

藏色散人
풀어 주다: 2023-04-08 08:50:01
앞으로
2503명이 탐색했습니다.

PHP는 WEB 개발을 위해 탄생했습니다. 과거에는 pthread가 등장하기 전까지 PHP에는 스레드가 없었기 때문에 PHP의 활력이 높아졌습니다.

추천: "PHP 튜토리얼; #🎜 🎜#》

1. 스레드 생성 및 사용

1. 스레드 클래스

기본 생성 그리고 Use:

<?php
//通过继承Thread类来实现自己的线程类MyThread
class MyThread extends Thread{
    //重写构造函数
    function __construct(){
    }
    //重写run方法(运行的是子线程需要执行的任务)
    function run(){
    }
}
//对象的实例化和运行就和java一样
$mt = new MyThread();
$mt->start();
로그인 후 복사

물론 스레드 클래스로서 스레드 상태를 쿼리하고 스레드를 관리하기 위한 다른 방법이 있어야 합니다

<?php
//获取创建线程的父线程id
Thread::getCreatorId 
//获取当前线程id
Thread::getCurrentThreadId
//获取当前线程引用
Thread::getCurrentThread 
//将线程加入检测
Thread::join
//查看线程是否被检测(是否被join)
Thread::isJoined
//强行杀死线程
Thread::kill
로그인 후 복사

2.Worker 클래스

# 🎜🎜#Worker 클래스의 상위 클래스는 Thread 클래스이므로 기본적인 사용법은 Thread와 동일합니다. Thread 클래스와 비교하여 Worker 클래스는 스레드 재사용 기능을 추가합니다(스레드 생성 및 소멸에 소요되는 리소스를 줄이기 위해). 일반적으로 Stackable 클래스와 함께 사용되므로 작업자 클래스를 스레드로 사용할 수 있습니다. 사용할 스레드 또는 작업 컨테이너(예:

<?php
class Task extends Stackable{
    function __construct($no){
        $this->no = $no;
    }
    function run(){
        echo "task{$this->no}:run".PHP_EOL;
    }
}
class MyWork extends Worker{
    function __construct(){
    }
    function run(){
    }
}
$t1= new Task(1);
$t2= new Task(2);
$t3= new Task(3);
$my = new MyWork();
$my->stack($t1);
$my->stack($t2);
$my->start();
$my->stack($t3);
로그인 후 복사

최종 출력:

task1:run
task2:run
task3:run
로그인 후 복사

물론 Worker 클래스에는 상위 스레드가 이를 관리할 수 있는 다른 메서드가 있습니다.# 🎜🎜#

//获取还没执行的任务数量
Worker::getStacked 
//判断worker是否关闭
Worker::isShutdown
//判断worker是否在工作
Worker::isWorking
//关闭销毁worker
Worker::shutdown
//将任务压栈
Worker::stack
//将任务出栈(该api有问题,慎用)
Worker::unstack
로그인 후 복사

2. PHP 스레드에서 발생하는 일부 문제 및 주의사항

1 스레드 클래스의 속성은 해시에 직접 사용할 수 없습니다. 테이블(배열) 연산(예:

//这样是无效的
$this->var1["hello"] = "world"; 
//改为
$this->var1 = ["hello"=>"world"];
로그인 후 복사

Why?) 스레드 클래스 속성 할당은 직렬화를 통해 구현되므로 그 본질은 직렬화된 데이터를 저장하는 것이므로 PHP의 해시 테이블(배열)에 대한 일반적인 직접 작업은 지원되지 않습니다.

2. 스레드 클래스의 속성은 "클로저 함수"일 수 없습니다.

Reason: 따라서 "콜백을 사용하려는 경우 클로저 함수를 직렬화할 수 없습니다. 그렇다면 스레드를 포기하세요;

3. 스레드 객체는 PHP의 두 번째 공간을 엽니다

(1) 스레드가 생성된 후 , 상위 스레드의 변수에 액세스할 수 없습니다. $GLOBALS 또는 global과 같은 사용법은 상위 스레드의 전역 변수를 작동할 수 없습니다.

(2) 그러나, 상위 스레드는 하위 스레드 객체의 내용에 액세스할 수 있습니다.

위 내용은 PHP pthread 확장 사용법과 함정의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!