国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

協(xié)程

協(xié)程是一種比線程更輕量級(jí)的用戶級(jí)并發(fā)機(jī)制,能夠在進(jìn)程中實(shí)現(xiàn)多任務(wù)調(diào)度。它通過(guò)手動(dòng)控制掛起和恢復(fù)來(lái)實(shí)現(xiàn)協(xié)程間的切換,避免了進(jìn)程上下文切換的開(kāi)銷。
workerman提供了一個(gè)通用的協(xié)程接口,底層自動(dòng)兼容Swoole/Swow/Fiber驅(qū)動(dòng)。

提示
此特性需要 workerman>=5.1.0

注意

  • 協(xié)程僅支持Swoole Swow Fiber驅(qū)動(dòng)
  • 如果使用Fiber驅(qū)動(dòng)時(shí)需要安裝 composer require revolt/event-loop
  • Swoole或者Swow驅(qū)動(dòng)可以實(shí)現(xiàn)PHP阻塞函數(shù)自動(dòng)協(xié)程化,從而實(shí)現(xiàn)原來(lái)的同步代碼異步執(zhí)行
  • Fiber無(wú)法像SwooleSwow那樣自動(dòng)協(xié)程化,遇到PHP自帶的阻塞函數(shù)時(shí)會(huì)阻塞整個(gè)進(jìn)程,并不會(huì)發(fā)生協(xié)程切換
  • 當(dāng)使用Swoole Swow Fiber驅(qū)動(dòng)時(shí),workerman每次運(yùn)行onWorkerStart onMessage onConnect onClose等回調(diào)時(shí)會(huì)自動(dòng)創(chuàng)建一個(gè)協(xié)程來(lái)執(zhí)行
  • 可以利用$worker->eventLoop=xxx;給不同worker設(shè)置不同的協(xié)程驅(qū)動(dòng)
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Coroutine;
use Workerman\Events\Swoole;
use Workerman\Events\Fiber;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';

$worker1 = new Worker('http://0.0.0.0:8001');
$worker1->eventLoop = Swoole::class; // 使用Swoole協(xié)程
$worker1->onMessage = function (TcpConnection $connection, Request $request) {
    Coroutine::create(function () {
        echo file_get_contents("http://www.example.com/event/notify");
    });
    $connection->send('ok');
};

$worker2 = new Worker('http://0.0.0.0:8001');
$worker2->eventLoop = Fiber::class; // 使用自帶的Fiber協(xié)程
$worker2->onMessage = function (TcpConnection $connection, Request $request) {
    Coroutine::create(function () {
        echo file_get_contents("http://www.example.com/event/notify");
    });
    $connection->send('ok');
};

Worker::runAll();

協(xié)程提供的接口

interface CoroutineInterface
{

    /**
     * 創(chuàng)建協(xié)程并立即執(zhí)行
     */
    public static function create(callable $callable, ...$data): CoroutineInterface;

    /**
     * 開(kāi)始協(xié)程運(yùn)行
     */
    public function start(mixed ...$args): mixed;

    /**
     * 恢復(fù)協(xié)程運(yùn)行
     */
    public function resume(mixed ...$args): mixed;

    /**
     * 獲取協(xié)程id
     */
    public function id(): int;

    /**
     * 設(shè)置協(xié)程銷毀時(shí)的回調(diào)
     */
    public static function defer(callable $callable): void;

    /**
     * 暫停當(dāng)前協(xié)程
     */
    public static function suspend(mixed $value = null): mixed;

    /**
     * 獲取當(dāng)前協(xié)程
     */
    public static function getCurrent(): CoroutineInterface|Fiber|SwowCoroutine|static;

    /**
     * 判斷當(dāng)前是否是協(xié)程環(huán)境
     */
    public static function isCoroutine(): bool;

}

關(guān)于協(xié)程

優(yōu)勢(shì)

PHP引入?yún)f(xié)程后最大的作用就是可以用同步的方式編寫異步代碼,避免了回調(diào)地獄,提高了代碼的可讀性和可維護(hù)性。
協(xié)程能大幅度提升IO密集型業(yè)務(wù)的彈性,可以用較少的進(jìn)程提供更大的吞吐量。

劣勢(shì)

但是引入?yún)f(xié)程后開(kāi)發(fā)者需要時(shí)刻注意全局變量污染、資源競(jìng)爭(zhēng)、第三方庫(kù)改造等問(wèn)題,開(kāi)發(fā)維護(hù)成本增大,心智負(fù)擔(dān)明顯增加。

引入?yún)f(xié)程后產(chǎn)生了協(xié)程創(chuàng)建、調(diào)度、銷毀、連接池等額外開(kāi)銷。
通過(guò)大量壓測(cè)數(shù)據(jù)來(lái)看,在充分利用CPU的情況下,引入?yún)f(xié)程后極限性能比阻塞式IO下降約10%-20%。

編輯于2025-02-07 18:07:15 完善本頁(yè) +發(fā)起討論
贊助商