PHP多線程如何實(shí)現(xiàn)線程池

PHP
小樊
82
2024-11-06 01:01:36

在 PHP 中,實(shí)現(xiàn)線程池的最佳方法是使用 pthreads 擴(kuò)展。但是,pthreads 擴(kuò)展僅支持 CLI(命令行接口)模式,不適用于 Web 環(huán)境。因此,如果你需要在 Web 環(huán)境中實(shí)現(xiàn)線程池,可以考慮使用第三方庫(kù),如 parallel 或 amphp/amp。

以下是使用 pthreads 擴(kuò)展實(shí)現(xiàn)線程池的示例:

  1. 首先,確保已安裝 pthreads 擴(kuò)展。在 Ubuntu 系統(tǒng)中,可以使用以下命令安裝:
sudo apt-get install php-pthreads
  1. 創(chuàng)建一個(gè)名為 ThreadPool.php 的文件,并添加以下代碼:
<?php
class ThreadPool {
    private $threadCount;
    private $jobs = [];
    private $threads = [];
    private $running = true;

    public function __construct($threadCount) {
        if (!extension_loaded('pthreads')) {
            throw new Exception('pthreads extension not loaded.');
        }
        $this->threadCount = $threadCount;
    }

    public function addJob(callable $job) {
        $this->jobs[] = $job;
    }

    public function start() {
        for ($i = 0; $i < $this->threadCount; $i++) {
            $thread = new Thread(new Job($this->jobs));
            $thread->start();
            $this->threads[] = $thread;
        }
    }

    public function join() {
        foreach ($this->threads as $thread) {
            $thread->join();
        }
    }
}

class Job extends Thread {
    private $jobs;

    public function __construct(array $jobs) {
        $this->jobs = $jobs;
    }

    public function run() {
        foreach ($this->jobs as $job) {
            $job();
        }
    }
}

// 示例任務(wù)
function task() {
    echo "Task executed by thread " . Thread::currentThread()->getId() . PHP_EOL;
}

// 創(chuàng)建線程池并添加任務(wù)
$threadPool = new ThreadPool(3);
for ($i = 0; $i < 10; $i++) {
    $threadPool->addJob(function() use ($i) {
        task();
    });
}

// 啟動(dòng)線程池并等待任務(wù)完成
$threadPool->start();
$threadPool->join();
?>

在這個(gè)示例中,我們創(chuàng)建了一個(gè)名為 ThreadPool 的類(lèi),它接受一個(gè)參數(shù) $threadCount,表示線程池中的線程數(shù)量。我們還創(chuàng)建了一個(gè)名為 Job 的類(lèi),它實(shí)現(xiàn)了 Thread 類(lèi),并在其 run 方法中執(zhí)行任務(wù)。

要使用這個(gè)線程池,只需創(chuàng)建一個(gè) ThreadPool 實(shí)例,添加任務(wù),然后啟動(dòng)線程池并等待任務(wù)完成。在這個(gè)示例中,我們添加了 10 個(gè)任務(wù)和 3 個(gè)線程,因此每個(gè)線程將執(zhí)行 3 個(gè)任務(wù)。

0