検索
ホームページバックエンド開発PHPチュートリアルPHP におけるコルーチンとブロッキングの概要

PHP におけるコルーチンとブロッキングの概要

Aug 12, 2017 am 11:37 AM
php導入関連している

この記事では、主に PHP のコルーチンとブロックについての理解と考え方を、サンプル コードを通じて詳しく紹介しています。PHP を学習または使用する人にとって、一定の参考となる価値があります。必要な方は以下を参照してください。一緒に学びましょう。

前書き

この記事では主に、PHP のコルーチンとブロックについての理解と考え方を紹介し、参考と学習のために共有します。以下では多くのことを説明しません。詳細な紹介を見てみましょう。

プロセス、スレッド、コルーチン

プロセス、スレッド、コルーチンについては、非常に詳細で充実したブログや学習リソースがありますので、ここでは詳しく説明しません。

  • プロセスには独自の独立したヒープとスタックがあり、ヒープもスタックも共有しません。プロセスはオペレーティング システムによってスケジュールされます。

  • スレッドには独自の独立したスタックと共有ヒープがあります。ヒープは共有されますが、スレッドもオペレーティング システムによってスケジュールされます (標準スレッドは共有されます)。

  • コルーチンはスレッドと同様にヒープを共有しますが、スタックは共有しません。コルーチンは、コルーチンのコード内でプログラマによって明示的にスケジュールされます。

PHP におけるコルーチン yield の基本的な実装

yield の基本的な実装はジェネレーター クラスであり、イテレーター クラスはイテレーター インターフェイスの実装です。上記の分析については、PHP 公式ドキュメントを参照してください。

http://php.net/manual/zh/clas...


そしてこの詳細なドキュメント:

http://www.jb51.net/article/39424_all.htm

これを使用して達成しますコルーチンのマルチタスク スケジューリングに基づいた例を示し、ブロックに関する私の考えをいくつかお話します。

単純なスケジュールされた実行タスクのカスタマイズの例:

(この例は、上記の Brother Niao によって実装されたコルーチン スケジューリング コードに依存する必要があります)

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 ) // 序列化回调,抛出一个异常以表示生成器不能被序列化。
}

上記の実装は次のとおりです:


2 つを生成しますタスクを並列実行し、実行中に各タスクのブロックを数秒間シミュレートします。

    コルーチンが切り替わるときにスムーズに切り替えることができ、タスクのブロックは相互に影響しません。
  • なぜ上記のことをしなければならないのでしょうか?コルーチンの実装は非常に強力で興味深いものであり、並列マルチタスクを可能にすることができますが、タスクの 1 つでシステム関数 sleep() を呼び出すと、ブロック タスクによって実行が妨げられることがわかりました。コルーチンの切り替え 実際、これはコルーチンの実装原則にも当てはまります。
  • 次に、コルーチンのブロックもシミュレートしたいと思いますが、それが実現可能かどうかを確認するためにブロックを発生させません。 PHP 自体は、コルーチン呼び出しをサポートするためのジェネレーターのみを提供します。拡張機能に依存しない場合は、Java ほど強力ではなく、サブスレッドを開くことで実装できます。

    Javaのサブスレッドは独立して実行され、お互いにブロックしない印象があるので、PHPではマルチスレッドに近い仕組みが実装できるので、呼び出し処理中にノンブロッキングを実現できるのではないかと考えています。
このように実装して考えた結果、最初に誤解に陥ったのは、PHP ネイティブ関数 sleep() のブロックによる誤解でした。本当にノンブロッキングを実現するには、言い換えれば、非同期に実装するには、基礎となる言語に依存する必要があります。

後で、私は真実を理解しました。特定のメソッドまたは関数は実行中にブロックされるため、現在のメソッドをカスタムメソッドに置き換えて、(コルーチンのスケジューリング全体と比較して)非ブロックにします。それだけでは十分ではありません。 ?たとえば、上記のスケジュールされた実行を自分で実装しました。
一方、コルーチン スケジューリング自体の目的は、タスクの実行プロセスをできるだけ小さく切り分けて、実行を迅速に切り替えて並列処理を実現することです。この観点から、コルーチンはプログラミングのアイデアともみなされる必要があります。

sleep() 的时候,阻塞任务会阻止协程切换,其实从协程的实现原理上来书也是这么回事。

那么,我也就想模拟协程阻塞,但是不产生阻塞看是否可行。PHP本身只提供了生成器为协程调用提供了支撑,如果不依赖扩展,没有提供多线程的程序实现方式,没有java那么强大,可以开子线程进行实现。

我印象中java的子线程是独立执行且不会相互阻塞的,所以我在想,PHP既然可以实现类似于多线程这样的机制,那么能不能实现调用过程中非阻塞呢?

经过这样一个实现和思考,一开始是陷入了一个误区的,是由于PHP原生函数 sleep() 以下は、実行のためにプログラムをできるだけ小さな部分に分割する例です:

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 &#39;<br>&#39;.&#39;A &#39;.$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 &#39;<br>&#39;.&#39;B &#39;.$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();
この例では、range を使用して大きな整数配列を生成する元の方法から、スライス実行に切り替えます。つまり、トラバース時に指定された値を取得するということですが、コードの観点から見ると、メモリ消費量は以前に比べて非常に少なくなります。

以上がPHP におけるコルーチンとブロッキングの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPおよびPython:さまざまなパラダイムが説明されていますPHPおよびPython:さまざまなパラダイムが説明されていますApr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPとPython:彼らの歴史を深く掘り下げますPHPとPython:彼らの歴史を深く掘り下げますApr 18, 2025 am 12:25 AM

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

PHPとPythonの選択:ガイドPHPとPythonの選択:ガイドApr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPとフレームワーク:言語の近代化PHPとフレームワーク:言語の近代化Apr 18, 2025 am 12:14 AM

PHPは、多数のWebサイトとアプリケーションをサポートし、フレームワークを通じて開発ニーズに適応するため、近代化プロセスで依然として重要です。 1.PHP7はパフォーマンスを向上させ、新機能を紹介します。 2。Laravel、Symfony、Codeigniterなどの最新のフレームワークは、開発を簡素化し、コードの品質を向上させます。 3.パフォーマンスの最適化とベストプラクティスは、アプリケーションの効率をさらに改善します。

PHPの影響:Web開発などPHPの影響:Web開発などApr 18, 2025 am 12:10 AM

phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?Apr 17, 2025 am 12:25 AM

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

PHPは、オブジェクトのクローニング(クローンキーワード)と__Clone Magicメソッドをどのように処理しますか?PHPは、オブジェクトのクローニング(クローンキーワード)と__Clone Magicメソッドをどのように処理しますか?Apr 17, 2025 am 12:24 AM

PHPでは、クローンキーワードを使用してオブジェクトのコピーを作成し、\ _ \ _クローンマジックメソッドを使用してクローン動作をカスタマイズします。 1.クローンキーワードを使用して浅いコピーを作成し、オブジェクトのプロパティをクローン化しますが、オブジェクトのプロパティはクローニングしません。 2。\ _ \ _クローン法は、浅いコピーの問題を避けるために、ネストされたオブジェクトを深くコピーできます。 3.クローニングにおける円形の参照とパフォーマンスの問題を避けるために注意し、クローニング操作を最適化して効率を向上させます。

PHP対Python:ユースケースとアプリケーションPHP対Python:ユースケースとアプリケーションApr 17, 2025 am 12:23 AM

PHPはWeb開発およびコンテンツ管理システムに適しており、Pythonはデータサイエンス、機械学習、自動化スクリプトに適しています。 1.PHPは、高速でスケーラブルなWebサイトとアプリケーションの構築においてうまく機能し、WordPressなどのCMSで一般的に使用されます。 2。Pythonは、NumpyやTensorflowなどの豊富なライブラリを使用して、データサイエンスと機械学習の分野で驚くほどパフォーマンスを発揮しています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール