Maison > développement back-end > tutoriel php > Utilisation et pièges de l'expansion PHP pthread

Utilisation et pièges de l'expansion PHP pthread

藏色散人
Libérer: 2023-04-08 08:50:01
avant
2592 Les gens l'ont consulté

PHP est né pour le développement WEB. Dans le passé, PHP n'avait pas de threads jusqu'à l'émergence de pthread, qui ajoutait de la vitalité à PHP

Recommandé : "Tutoriel PHP"

1. Création et utilisation des threads

1. Classe de thread

Création et utilisation de base :

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

Bien sûr, comme une classe de thread, il doit y avoir d'autres méthodes pour interroger l'état des threads et gérer les threads

<?php
//获取创建线程的父线程id
Thread::getCreatorId 
//获取当前线程id
Thread::getCurrentThreadId
//获取当前线程引用
Thread::getCurrentThread 
//将线程加入检测
Thread::join
//查看线程是否被检测(是否被join)
Thread::isJoined
//强行杀死线程
Thread::kill
Copier après la connexion

2 Classe Worker

La classe parent de la classe Worker est la classe Thread, donc l'utilisation de base est. le même que Thread. Par rapport à la classe Thread, la classe Worker ajoute la fonction de réutilisation des threads (pour réduire les ressources consommées par la création et la destruction des threads). Elle est généralement utilisée en conjonction avec la classe Stackable, ce qui signifie que la classe Worker peut être utilisée comme classe Worker. thread ou une tâche. Conteneur à utiliser, tel que :

<?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);
Copier après la connexion

Résultat final :

task1:run
task2:run
task3:run
Copier après la connexion

Bien sûr, la classe Worker a d'autres méthodes permettant au thread parent de le gérer

//获取还没执行的任务数量
Worker::getStacked 
//判断worker是否关闭
Worker::isShutdown
//判断worker是否在工作
Worker::isWorking
//关闭销毁worker
Worker::shutdown
//将任务压栈
Worker::stack
//将任务出栈(该api有问题,慎用)
Worker::unstack
Copier après la connexion

2. Quelques problèmes et points d'attention rencontrés par les threads PHP

1 Les attributs de la classe thread ne peuvent pas effectuer directement des opérations de table de hachage (tableau), telles que :

.
//这样是无效的
$this->var1["hello"] = "world"; 
//改为
$this->var1 = ["hello"=>"world"];
Copier après la connexion

Pourquoi ? Étant donné que l'attribution des attributs de classe de thread est implémentée via la sérialisation, son essence est de stocker des données sérialisées, de sorte que le fonctionnement direct commun de la table de hachage (tableau) de PHP n'est pas pris en charge.

2. L'attribut de la classe thread ne peut pas être une "fonction de fermeture"

Raison : La fonction de fermeture ne peut donc pas être sérialisée, si vous souhaitez utiliser une "fonction de rappel" dans le thread, puis abandonnez le thread ;

3. L'objet thread ouvre le deuxième espace de PHP

(1) Une fois le thread créé, il ne peut pas accéder aux variables du thread parent. , comme $GLOBALS ou global. Ni l'un ni l'autre ne peuvent exploiter les variables globales du thread parent, ce qui doit prendre en compte les problèmes de sécurité des threads

(2) Cependant, le thread parent peut accéder au contenu du thread enfant ; objet;

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal