Une introduction aux coroutines et au blocage en PHP
Cet article vous présente principalement une certaine compréhension et réflexion sur les coroutines et le blocage en PHP. L'article le présente en détail à travers un exemple de code. Il a une certaine valeur d'apprentissage de référence pour que tous les amis qui en ont besoin apprennent. avec l'éditeur ci-dessous.
Avant-propos
Cet article vous présente principalement la compréhension et la réflexion sur les coroutines et le blocage en PHP, et le partage pour votre référence et votre étude . Pas grand chose à dire ci-dessous, jetons un œil à l'introduction détaillée :
Processus, thread, coroutine
À propos du processus. , les fils de discussion et les coroutines, il existe des blogs ou des ressources d'apprentissage très détaillés et riches. Je n'entrerai pas dans les détails ici, je présenterai brièvement ces choses ici.
Le processus a son propre tas et sa pile indépendants. Il ne partage ni le tas ni la pile. Le processus est planifié par le système d'exploitation.
Les threads ont leur propre pile indépendante et leur tas partagé. Le tas est partagé mais la pile n'est pas partagée. Les threads sont également planifiés par le système d'exploitation (les threads standard le sont).
Les coroutines partagent le tas comme les threads, mais ne partagent pas les piles. Les coroutines sont planifiées explicitement par les programmeurs dans le code de la coroutine.
Implémentation de base du rendement de la coroutine en PHP
L'implémentation fondamentale du rendement est de génère la classe Iterator, et la classe iterator est l'implémentation de l'interface iterator :
Generator implements Iterator { public mixed current ( void ) // 返回当前产生的值 public mixed key ( void ) // 返回当前产生的键 public void next ( void ) // 生成器继续执行 public void rewind ( void ) // 重置迭代器,如果迭代已经开始了,这里会抛出一个异常。 // renwind的执行将会导致第一个yield被执行, 并且忽略了他的返回值. public mixed send ( mixed $value ) // 向生成器中传入一个值,并且当做 yield 表达式的结果,然后继续执行生成器。如果当这个方法被调用时,生成器 // 不在 yield 表达式,那么在传入值之前,它会先运行到第一个 yield 表达式。 public void throw ( Exception $exception ) // 向生成器中抛入一个异常 public bool valid ( void ) // 检查迭代器是否被关闭 public void __wakeup ( void ) // 序列化回调,抛出一个异常以表示生成器不能被序列化。 }
Vous pouvez vous référer à la documentation officielle PHP pour l'analyse ci-dessus.
http://php.net/manual/zh/clas...
Et ce document détaillé :
http://www.jb51.net/ article /39424_all.htm
Je vais donner un exemple basé sur la planification multitâche coroutine qu'il a mise en œuvre et parler de certaines de mes réflexions sur le blocage.
Exemple de personnalisation de tâches d'exécution planifiées simples :
(Cet exemple doit s'appuyer sur le code de planification de coroutine implémenté par Brother Niao ci-dessus )
class timer { private $start = 0; // 定时开始时间 private $timer; // 间隔的时间差,单位秒 private $value = 0; // 产生的结果值 private $callback; // 异步回调 private $isEnd = false; // 当前定时器任务是否结束 public function __construct($timer,callable $callback) { $this->start = time(); $this->timer = $timer; $this->callback = $callback; } public function run() { if($this->valid()) { $callback = $this->callback; $callback($this->value ++,$this); $this->start = time(); } } /** * 定时执行检查 */ public function valid() { $end = time(); if($end - $this->start >= $this->timer) { return true; } else { return false; } } public function setEnd($isEnd) { $this->isEnd = $isEnd; } public function getEnd() { return $this->isEnd; } } /** * 模拟阻塞的协程1 * */ function taskObject1() { $timer = new timer(1,function($value,timer $timer) { if($value >= 5) { $timer->setEnd(true); } echo '<br>'.'A '.$value; }); $tid = (yield getTaskId()); while (true) { if($timer->getEnd() == true) { break; } yield $timer->run(); } } /** * 模拟阻塞的协程2 * */ function taskObject2() { $timer = new timer(2,function($value,timer $timer) { if($value >= 3) { $timer->setEnd(true); } echo '<br>'.'B '.$value; }); $tid = (yield getTaskId()); while (true) { if($timer->getEnd() == true) { break; } yield $timer->run(); } } $scheduler = new Scheduler; $scheduler->newTask(taskObject1()); $scheduler->newTask(taskObject2()); $scheduler->run();
L'implémentation ci-dessus est :
Générer deux tâches, les exécuter en parallèle et attribuer à chaque tâche un Simulez quelques secondes de blocage pendant l'exécution ;
permet une commutation en douceur lorsque les coroutines sont commutées, et le blocage des tâches ne s'affecte pas
Réflexion :
dans l'une des tâches, la tâche de blocage empêchera en fait le changement de coroutine. le principe de mise en œuvre de la coroutine Il en va de même pour les livres. sleep()
, c'est-à-dire si je veux vraiment atteindre le non-. le blocage ou l'implémentation asynchrone doivent dépendre du langage sous-jacent. sleep()
Ce qui suit est un exemple de découpe d'un programme en morceaux aussi petits que possible pour l'exécution :
// 一个简单的例子 <?php function xrange($start, $end, $step = 1) { for ($i = $start; $i <= $end; $i += $step) { yield $i; } } foreach (xrange(1, 1000000) as $num) { echo $num, "\n"; }
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds

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.

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.

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

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.

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

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

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

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
