PHP pthread 拡張の使用法と落とし穴

藏色散人
リリース: 2023-04-08 08:50:01
転載
2583 人が閲覧しました

PHP は WEB 開発のために生まれました。以前は、PHP の活力を高めた pthread が登場するまで、PHP にはスレッドがありませんでした。

推奨: 「PHP チュートリアル

1. スレッドの作成と使用

1. スレッド クラス

基本的な作成と使用:

<?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 クラスであるため、基本的な使用方法は次のとおりです。スレッドと同じです。 Worker クラスは、Thread クラスと比較して、スレッドの再利用機能 (スレッドの作成と破棄によって消費されるリソースを削減するため) を追加しており、通常は 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. スレッド クラスの属性は、次のようなハッシュ テーブル (配列) 操作を直接実行できません。ああ、

なぜですか?スレッド クラス属性の割り当てはシリアル化によって実装されるため、その本質はシリアル化されたデータを格納することであるため、PHP のハッシュ テーブル (配列) の一般的な直接操作はサポートされていません。

2. スレッド クラスの属性を「クロージャ関数」にすることはできません

理由: クロージャ関数はシリアル化できないため、スレッド クラスで「コールバック関数」を使用したい場合は、 thread, then Give up the thread;

3. スレッド オブジェクトは、PHP

の 2 番目のスペースを開きます (1) スレッドの作成後、親スレッドの変数にアクセスすることはできません$GLOBALS や global など、どちらも親スレッドのグローバル変数を操作することはできないため、スレッドの安全性の問題を考慮する必要があります;

(2) ただし、親スレッドは子スレッドのコンテンツにアクセスできます。物体; ###

以上がPHP pthread 拡張の使用法と落とし穴の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート