Maison développement back-end tutoriel php Mécanisme de synchronisation de la structure des données sous programmation simultanée PHP

Mécanisme de synchronisation de la structure des données sous programmation simultanée PHP

May 07, 2024 pm 01:00 PM
php 并发编程 Mécanisme de synchronisation

Dans la programmation simultanée PHP, le mécanisme de synchronisation de la structure de données suivant est crucial : section critique : utilisez le mot-clé synchronisé pour protéger la zone de code de la section critique, permettant à un seul thread de s'exécuter à la fois ; verrouillage mutex : assuré par le lock() et Méthodes unlock() Un seul thread à la fois accède aux ressources partagées ; verrouillage en lecture-écriture : permet à plusieurs threads de lire en même temps, mais n'autorise qu'un seul thread à la fois à écrire des données partagées : file d'attente FIFO, utilisée pour délivrer des messages et des tâches ; pile : structure de données LIFO, utilisée pour gérer le contexte d'appel. Dans le cas réel, le robot d'exploration simultané utilise une file d'attente pour stocker les URL analysées et utilise un verrou mutex pour protéger les droits d'accès de la file d'attente afin d'assurer la sécurité des threads.

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

Mécanisme de synchronisation de la structure des données sous programmation simultanée PHP

Dans la programmation simultanée PHP, le mécanisme de synchronisation est crucial pour garantir l'exactitude et la cohérence lorsque plusieurs threads ou processus accèdent aux données partagées en même temps. Cet article explorera les mécanismes courants de synchronisation des structures de données en PHP et fournira des exemples pratiques pour illustrer.

Critical Section

Critical Section est un mécanisme de synchronisation utilisé pour protéger une région de code afin qu'elle ne puisse être exécutée que par un seul thread à la fois. En PHP, les sections critiques peuvent être déclarées à l'aide du mot-clé synchronized. synchronized 关键字来声明临界区。

class Foo {
    private $data = [];

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

互斥锁

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

$mutex = new Mutex();

$mutex->lock();
try {
    // 临界区代码...
} finally {
    $mutex->unlock();
}
Copier après la connexion

读写锁

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

$rwLock = new RWLock();

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

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

队列

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

$queue = new SplQueue();

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

while (!$queue->isEmpty()) {
    $task = $queue->dequeue();
    // 处理任务
}
Copier après la connexion

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

$stack = new SplStack();

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

while (!$stack->isEmpty()) {
    $call = $stack->pop();
    // 处理调用
}
Copier après la connexion

Mutex

Un mutex est un objet de verrouillage utilisé pour garantir qu'un seul thread peut accéder à une ressource partagée à la fois. Il existe diverses implémentations de mutex en PHP, telles que les classes Mutex et 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();
}
Copier après la connexion

Verrou en lecture-écriture

🎜🎜Un verrou en lecture-écriture est un objet de verrouillage qui permet à plusieurs threads de lire des données partagées en même temps, mais un seul thread peut écrire des données partagées à la fois. La classe RWLock en PHP peut implémenter des verrous en lecture-écriture. 🎜rrreee🎜🎜Queue🎜🎜🎜Queue est une structure de données FIFO (premier entré, premier sorti) qui peut être utilisée pour transmettre des messages et des tâches dans un environnement simultané. La classe SplQueue en PHP fournit une implémentation de file d'attente. 🎜rrreee🎜🎜Stack🎜🎜🎜La pile est une structure de données LIFO (dernier entré, premier sorti) qui peut être utilisée pour gérer le contexte d'appel dans un environnement simultané. La classe SplStack en PHP fournit une implémentation de pile. 🎜rrreee🎜🎜Cas pratique : Crawler simultané🎜🎜🎜Dans un robot parallèle, la liste d'URL explorées est une structure de données partagée et nécessite un mécanisme de synchronisation pour garantir la sécurité des threads. Une pratique courante consiste à utiliser une file d'attente pour stocker les URL analysées et à utiliser un mutex pour protéger l'accès à la file d'attente. 🎜rrreee🎜Dans ce cas, la file d'attente et le verrouillage mutex réalisent conjointement le contrôle de synchronisation de l'exploration simultanée multithread, garantissant l'accès et la modification corrects de la liste d'URL. 🎜

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Configuration du projet CakePHP Configuration du projet CakePHP Sep 10, 2024 pm 05:25 PM

Dans ce chapitre, nous comprendrons les variables d'environnement, la configuration générale, la configuration de la base de données et la configuration de la messagerie dans CakePHP.

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Date et heure de CakePHP Date et heure de CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

Téléchargement de fichiers CakePHP Téléchargement de fichiers CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

Routage CakePHP Routage CakePHP Sep 10, 2024 pm 05:25 PM

Dans ce chapitre, nous allons apprendre les sujets suivants liés au routage ?

Discuter de CakePHP Discuter de CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

CakePHP créant des validateurs CakePHP créant des validateurs Sep 10, 2024 pm 05:26 PM

Le validateur peut être créé en ajoutant les deux lignes suivantes dans le contrôleur.

See all articles