Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mekanisme penyegerakan struktur data di bawah pengaturcaraan serentak PHP

Mekanisme penyegerakan struktur data di bawah pengaturcaraan serentak PHP

王林
王林asal
2024-05-07 13:00:02645semak imbas

Dalam pengaturcaraan serentak PHP, mekanisme penyegerakan struktur data berikut adalah penting: bahagian kritikal: gunakan kata kunci disegerakkan untuk melindungi kawasan kod bahagian kritikal, membenarkan hanya satu utas untuk dilaksanakan pada satu masa: dipastikan melalui kunci() dan kaedah buka kunci() Hanya satu utas mengakses sumber yang dikongsi pada satu masa: membenarkan berbilang utas membaca pada masa yang sama, tetapi hanya membenarkan satu utas untuk menulis data yang dikongsi pada satu masa: struktur data FIFO, digunakan untuk menyampaikan mesej dan tugas; timbunan: struktur data LIFO, Digunakan untuk mengurus konteks panggilan. Dalam kes sebenar, perangkak serentak menggunakan baris gilir untuk menyimpan URL yang dirangkak dan menggunakan kunci mutex untuk melindungi hak akses baris gilir untuk mencapai keselamatan benang.

PHP 并发编程下的数据结构同步机制

Mekanisme penyegerakan struktur data di bawah pengaturcaraan serentak PHP

Dalam pengaturcaraan serentak PHP, mekanisme penyegerakan adalah penting untuk memastikan ketepatan dan ketekalan apabila beberapa utas atau proses mengakses data dikongsi pada masa yang sama. Artikel ini akan meneroka mekanisme biasa untuk menyegerakkan struktur data dalam PHP dan menyediakan contoh praktikal untuk digambarkan.

Bahagian Kritikal

Bahagian Kritikal ialah mekanisme penyegerakan yang digunakan untuk melindungi kawasan kod supaya ia hanya boleh dilaksanakan oleh satu utas pada satu masa. Dalam PHP, bahagian kritikal boleh diisytiharkan menggunakan kata kunci synchronized. synchronized 关键字来声明临界区。

class Foo {
    private $data = [];

    public function bar() {
        // 临界区开始
        synchronized($this->data) {
            // 临界区代码,只允许一个线程同时执行
        }
        // 临界区结束
    }
}

互斥锁

互斥锁是一种锁对象,用于确保一次只有一个线程可以访问共享资源。PHP 中有多种互斥锁实现,例如 MutexSemaphore 类。

$mutex = new Mutex();

$mutex->lock();
try {
    // 临界区代码...
} finally {
    $mutex->unlock();
}

读写锁

读写锁是一种允许多个线程同时读共享数据,但一次只能有一个线程写共享数据的锁对象。PHP 中的 RWLock 类可以实现读写锁。

$rwLock = new RWLock();

$rwLock->lockReadOnly();
try {
    // 多个线程可以同时读取共享数据
} finally {
    $rwLock->unlockReadOnly();
}

$rwLock->lockWrite();
try {
    // 只有一个线程可以写入共享数据
} finally {
    $rwLock->unlockWrite();
}

队列

队列是一种 FIFO(先进先出)的数据结构,可用于在并发环境中传递消息和任务。PHP 中的 SplQueue 类提供了队列实现。

$queue = new SplQueue();

$queue->enqueue('任务 1');
$queue->enqueue('任务 2');

while (!$queue->isEmpty()) {
    $task = $queue->dequeue();
    // 处理任务
}

栈是一种 LIFO(后进先出)的数据结构,可用于在并发环境中管理调用上下文。PHP 中的 SplStack

$stack = new SplStack();

$stack->push('调用 1');
$stack->push('调用 2');

while (!$stack->isEmpty()) {
    $call = $stack->pop();
    // 处理调用
}

Mutex

Mutex ialah objek kunci yang digunakan untuk memastikan hanya satu utas boleh mengakses sumber yang dikongsi pada satu masa. Terdapat pelbagai pelaksanaan mutex dalam PHP, seperti kelas Mutex dan Semaphore.

class Crawler {
    private $queue;
    private $mutex;
    
    public function __construct() {
        $this->queue = new SplQueue();
        $this->mutex = new Mutex();
    }
    
    public function addUrl($url) {
        $this->mutex->lock();
        try {
            $this->queue->enqueue($url);
        } finally {
            $this->mutex->unlock();
        }
    }
    
    public function getNextUrl() {
        $this->mutex->lock();
        try {
            return $this->queue->dequeue();
        } finally {
            $this->mutex->unlock();
        }
    }
}

$crawler = new Crawler();

// 多个线程并发抓取 URL
$threads = [];
for ($i = 0; $i < 10; $i++) {
    $threads[] = new Thread(function() use ($crawler) {
        while (($url = $crawler->getNextUrl()) !== null) {
            // 抓取并处理 URL
        }
    });
}

foreach ($threads as $thread) {
    $thread->start();
}

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

Kunci baca-tulis

🎜🎜Kunci baca-tulis ialah objek kunci yang membenarkan berbilang utas membaca data kongsi pada masa yang sama, tetapi hanya satu utas boleh menulis data dikongsi pada satu-satu masa. Kelas RWLock dalam PHP boleh melaksanakan kunci baca-tulis. 🎜rrreee🎜🎜Queue🎜🎜🎜Queue ialah struktur data FIFO (masuk dahulu, keluar dahulu) yang boleh digunakan untuk menyampaikan mesej dan tugasan dalam persekitaran serentak. Kelas SplQueue dalam PHP menyediakan pelaksanaan baris gilir. 🎜rrreee🎜🎜Timbunan🎜🎜🎜Timbunan ialah struktur data LIFO (terakhir masuk dahulu) yang boleh digunakan untuk mengurus konteks panggilan dalam persekitaran serentak. Kelas SplStack dalam PHP menyediakan pelaksanaan tindanan. 🎜rrreee🎜🎜Kes praktikal: Perangkak serentak🎜🎜🎜Dalam perangkak selari, senarai URL yang dirangkak ialah struktur data dikongsi dan memerlukan mekanisme penyegerakan untuk memastikan keselamatan rangkaian. Amalan biasa ialah menggunakan baris gilir untuk menyimpan URL yang dirangkak dan menggunakan mutex untuk melindungi akses kepada baris gilir. 🎜rrreee🎜Dalam kes ini, baris gilir dan kunci mutex bersama-sama merealisasikan kawalan penyegerakan rangkak serentak berbilang benang, memastikan akses dan pengubahsuaian senarai URL yang betul. 🎜

Atas ialah kandungan terperinci Mekanisme penyegerakan struktur data di bawah pengaturcaraan serentak PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn