Heim  >  Artikel  >  Backend-Entwicklung  >  Verwendung und Fallstricke der PHP-Pthread-Erweiterung

Verwendung und Fallstricke der PHP-Pthread-Erweiterung

藏色散人
藏色散人nach vorne
2020-01-17 17:40:212588Durchsuche

PHP wurde für die WEB-Entwicklung geboren, bis PHP aufkam, was PHP mehr Lebendigkeit verlieh.

Empfohlen: "PHP-Tutorial"

1. Erstellung und Verwendung von Threads

1. Thread-Klasse

Grundlegende Erstellung und Verwendung:

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

Natürlich, wie eine Thread-Klasse, es muss andere Methoden zum Abfragen des Thread-Status und zum Verwalten von Threads geben

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

2. Worker-Klasse

Die übergeordnete Klasse der Worker-Klasse ist die Thread-Klasse, daher ist die grundlegende Verwendung das gleiche wie Thread. Im Vergleich zur Thread-Klasse fügt die Worker-Klasse die Funktion der Thread-Wiederverwendung hinzu (um den Ressourcenverbrauch durch das Erstellen und Zerstören von Threads zu reduzieren). Sie wird normalerweise in Verbindung mit der Stackable-Klasse verwendet, was bedeutet, dass die Worker-Klasse als verwendet werden kann Thread oder eine zu verwendende Aufgabe, wie zum Beispiel:

<?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);

Endgültige Ausgabe:

task1:run
task2:run
task3:run

Natürlich verfügt die Worker-Klasse über andere Methoden für den übergeordneten Thread, um ihn zu verwalten

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

2. Einige Probleme und Aufmerksamkeitspunkte, auf die PHP-Threads stoßen

1. Die Attribute der Thread-Klasse können keine Hash-Tabellen-(Array-)Operationen direkt ausführen, wie zum Beispiel:

//这样是无效的
$this->var1["hello"] = "world"; 
//改为
$this->var1 = ["hello"=>"world"];

Warum? Da die Zuweisung von Thread-Klassenattributen durch Serialisierung implementiert wird, besteht ihr Kern darin, serialisierte Daten zu speichern, sodass die allgemeine direkte Operation der Hash-Tabelle (Array) von PHP nicht unterstützt wird.

2. Das Attribut der Thread-Klasse kann keine „Abschlussfunktion“ sein

Grund: Die Abschlussfunktion kann daher nicht serialisiert werden, wenn Sie eine „Callback-Funktion“ verwenden möchten Thread, dann Gib den Thread auf;

3. Das Thread-Objekt öffnet den zweiten Bereich von PHP

(1) Nachdem der Thread erstellt wurde, kann er nicht auf die Variablen des übergeordneten Threads zugreifen , wie $GLOBALS oder global, können die globalen Variablen des übergeordneten Threads nicht bedienen, was Thread-Sicherheitsprobleme berücksichtigen sollte. (2) Der übergeordnete Thread kann jedoch auf den Inhalt des untergeordneten Threads zugreifen Objekt;

Das obige ist der detaillierte Inhalt vonVerwendung und Fallstricke der PHP-Pthread-Erweiterung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen