目次
マルチタスク (並列性と同時性)
は、次の機能を指します。複数の同時アクティビティを処理しますが、同時イベントは必ずしも同時に発生する必要はありません。
は、同時に発生する 2 つの同時イベントを指し、同時実行の意味がありますが、同時実行は必ずしも並列である必要はありません。
generator
次に、コルーチン用の自動スケジューラ (Co 自動実行プログラム) を自動的に作成しましょう。必要はありません。手動で中断して再開するには
ホームページ バックエンド開発 PHPチュートリアル phpコルーチンの詳しい説明(例付き)

phpコルーチンの詳しい説明(例付き)

Sep 20, 2018 pm 05:41 PM
coroutine php コルーチン 非同期

この記事では、PHP コルーチンの詳細な説明 (例付き) を提供します。一定の参考価値があります。必要な友人が参照できます。お役に立てれば幸いです。

マルチタスク (並列性と同時性)

コルーチンについて話す前に、マルチプロセス、マルチスレッド、並列性、および同時性について話しましょう。

シングルコア プロセッサの場合、マルチプロセス マルチタスクの原理は、オペレーティング システムが毎回特定の CPU タイム スライスをタスクに割り当て、その後割り込み、次のタスクに特定のタイム スライスを実行させることです。そしてまた中断し、次の作業に進む、というように続きます。

実行タスクの切り替えが非常に速いため、外部ユーザーには複数のタスクが同時に実行されているような印象を与えます。

マルチプロセスのスケジューリングは、オペレーティング システムによって実装されます。プロセス自体は、いつスケジュールされるかを制御できません。つまり、プロセスのスケジューリング は、外部の # によって実行されます。 ## スケジューラ プリエンプティブ 実装

コルーチンでは、他のタスクが実行を継続できるように、現在実行中のタスクが自動的に制御をスケジューラに戻す必要があります。これは、

プリエンプティブマルチタスクの正反対であり、プリエンプティブ マルチタスクのスケジューラは、自身の希望に関係なく、実行中のタスクを強制的に中断できます。プログラムが自動的に制御を引き継ぐだけであれば、悪意のあるプログラムが他のタスクと共有せずにすべての CPU 時間を簡単に占有してしまうでしょう。

コルーチンのスケジューリングはコルーチン自体によって実装されます

積極的に制御を外部スケジューラーに放棄しますxrange 関数を実装するジェネレーターの例に戻ります。実行プロセス全体の切り替えは、次の図で表すことができます。

コルーチンは、

純粋なユーザーモード スレッド

として理解でき、むしろ コラボレーションを通じてタスクの切り替えを実行します。先取りよりも。 プロセスやスレッドと比較すると、コルーチンのすべての操作はオペレーティング システムのカーネル モードではなくユーザー モードで完了でき、作成と切り替えのコストが非常に低くなります。

簡単に言えば、

Coroutine

は、現在のタスクの実行を中断し、現在のローカル変数を保存し、次回実行を継続するために現在のローカル変数を復元するメソッドを提供することです。 大きなタスクを複数の小さなタスクに分割し、順番に実行できます。システム IO を待機している小さなタスクがある場合は、それをスキップして次の小さなタスクを実行します。このようにして、スケジュールを戻すことができます。オペレーションと CPU 計算の並列実行により、一般にタスクの実行効率が向上します。これがコルーチンの意味です。

マルチスレッド

単一コアの下では、マルチスレッドを実行する必要があります。 concurrent;

ただし、統合プロセスの現在のマルチスレッドはマルチコア CPU で実行できるため、並列処理が可能です。

Concurrency (並行性)

は、次の機能を指します。複数の同時アクティビティを処理しますが、同時イベントは必ずしも同時に発生する必要はありません。

Parallel (Parallesim)

は、同時に発生する 2 つの同時イベントを指し、同時実行の意味がありますが、同時実行は必ずしも並列である必要はありません。

重複する期間内で複数の操作を実行できます。


並列処理と同時実行の違い

同時実行

はプログラムの構造を指し、並列はプログラムの状態を指します。 runningParallel
は同時実行である必要があります。Parallel同時実行設計の一種です 単一のスレッドが Parallel## に到達することはできません# state
Coroutine

Coroutine サポートは

generator

に基づいており、ジェネレーターにデータを送り返す機能が追加されています (呼び出し元は呼び出されたジェネレーター関数にデータを送信します)。

これにより、ジェネレーターから呼び出し元への一方向通信が、両者の間の双方向通信に変更されます。send メソッドについては前の記事ですでに説明しました。コルーチンについて理解しましょう
同期コード

非同期実行コードが関与する前のコードは次のようになります

function printNum($max, $caller)
{
    for ($i=0; $i<$max; $i++ ) {
        echo "调度者:" . $caller . "  打印:" . $i . PHP_EOL;
    }
}

printNum(3, "caller1");
printNum(3, "caller2");

# output
调度者:caller1  打印:0
调度者:caller1  打印:1
调度者:caller1  打印:2
调度者:caller2  打印:0
调度者:caller2  打印:1
调度者:caller2  打印:2
ログイン後にコピー

コルーチンを使用した後のコードの改善

初稿、ジェネレーターの実行を手動で調整します

# 本代码手动调整了进程执行代码的顺序,当然本代码实现不用协程也可以,只是利用本流程说明协程作用
# 生成器给了我们函数中断,协程[生成器send]给了我们重新唤起生成器函数的能力
function printNumWithGen($max)
{
    for ($i=0; $i<$max; $i++ ) {
        $res = yield $i;
        echo $res;
    }
}

$gen1 = printNumWithGen(3);
$gen2 = printNumWithGen(3);

// 手动执行caller1 再 caller2
$gen1->send("调度者: caller1 打印:" . $gen1->current() . PHP_EOL);
$gen2->send("调度者: caller2 打印:" . $gen2->current() . PHP_EOL);

// 手动执行caller1 再 caller2
$gen1->send("调度者: caller1 打印:" . $gen1->current() . PHP_EOL);
$gen2->send("调度者: caller2 打印:" . $gen2->current() . PHP_EOL);

// 手动执行caller2 再 caller1
$gen2->send("调度者: caller2 打印:" . $gen2->current() . PHP_EOL);
$gen1->send("调度者: caller1 打印:" . $gen1->current() . PHP_EOL);

# output
调度者: caller1 打印:0
调度者: caller2 打印:0
调度者: caller1 打印:1
调度者: caller2 打印:1
调度者: caller2 打印:2
调度者: caller1 打印:2
ログイン後にコピー

概要

上記のケースにより、コルーチンの設計の意味とコルーチンの使用方法を誰もが理解できるはずです。

次に、コルーチン用の自動スケジューラ (Co 自動実行プログラム) を自動的に作成しましょう。必要はありません。手動で中断して再開するには


以上がphpコルーチンの詳しい説明(例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

CakePHP のロギング CakePHP のロギング Sep 10, 2024 pm 05:26 PM

CakePHP へのログインは非常に簡単な作業です。使用する関数は 1 つだけです。 cronjob などのバックグラウンド プロセスのエラー、例外、ユーザー アクティビティ、ユーザーが実行したアクションをログに記録できます。 CakePHP でのデータのログ記録は簡単です。 log()関数が提供されています

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

See all articles