Coroutine

Coroutine একটি ব্যবহারকারী স্তরের তুলনায় থ্রেডের তুলনায় আরও হালকা সংস্করণ যা প্রক্রিয়াটির মধ্যে একাধিক কাজের সময়সূচী তৈরি করে। এটি সাসপেন্ড এবং পুনরুদ্ধারের হাতে নিয়ন্ত্রণের মাধ্যমে coroutine মধ্যে স্যুইচিং সম্পন্ন করে, যা প্রক্রিয়া প্রসঙ্গ পরিবর্তনের খরচ এড়িয়ে চলে।
workerman একটি সাধারণ coroutine ইন্টারফেস প্রদান করে, যা গভীরভাবে Swoole/Swow/Fiber ড্রাইভারের সাথে স্বয়ংক্রিয়ভাবে সামঞ্জস্যপূর্ণ।

সতর্কতা
এই বৈশিষ্ট্যটির জন্য workerman>=5.1.0 প্রয়োজন

মনে রাখবেন

  • Coroutine কেবল Swoole Swow Fiber ড্রাইভার সমর্থন করে
  • यदि आप Fiber ড্রাইভার ব্যবহার করছেন তবে composer require revolt/event-loop ইনস্টল করতে হবে
  • Swoole বা Swow ড্রাইভার PHP অবরুদ্ধ ফাংশনগুলিকে স্বয়ংক্রিয়ভাবে coroutine এ রূপান্তর করতে পারে, যা পূর্ববর্তী সিঙ্ক্রোনাস কোডকে অ্যাসিনক্রোনাসভাবে কার্যকর করার অনুমতি দেয়
  • তবে Fiber Swoole এবং Swow এর মতো স্বয়ংক্রিয়ভাবে coroutine এ রূপান্তর করতে সক্ষম নয়, PHP এর সাথে আসা অবরুদ্ধ ফাংশনগুলি সম্মুখীন হলে সম্পূর্ণ প্রক্রিয়াটি অবরুদ্ধ হয়ে যাবে এবং coroutine স্যুইচিং ঘটবে না
  • যখন Swoole Swow Fiber ড্রাইভার ব্যবহার করা হয়, workerman প্রতিবার onWorkerStart onMessage onConnect onClose ইত্যাদি কলব্যাক চলানোর সময় একটি coroutine তৈরি করবে
  • বিভিন্ন worker জন্য ভিন্ন coroutine ড্রাইভার সেট করতে $worker->eventLoop=xxx; ব্যবহার করা যায়
<?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 coroutine ব্যবহার করা
$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 coroutine ব্যবহার করা
$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();

Coroutine দ্বারা প্রদত্ত ইন্টারফেস

interface CoroutineInterface
{

    /**
     * Coroutine তৈরি করুন এবং সাথে সাথে কার্যকর করুন
     */
    public static function create(callable $callable, ...$data): CoroutineInterface;

    /**
     * Coroutine চালানো শুরু করুন
     */
    public function start(mixed ...$args): mixed;

    /**
     * Coroutine পুনরুদ্ধার করুন
     */
    public function resume(mixed ...$args): mixed;

    /**
     * Coroutine id পান
     */
    public function id(): int;

    /**
     * Coroutine ধ্বংস হওয়ার সময় কলব্যাক সেট করুন
     */
    public static function defer(callable $callable): void;

    /**
     * বর্তমান coroutine বিরক্ত করুন
     */
    public static function suspend(mixed $value = null): mixed;

    /**
     * বর্তমান coroutine পান
     */
    public static function getCurrent(): CoroutineInterface|Fiber|SwowCoroutine|static;

    /**
     * বর্তমান কি coroutine পরিবেশ কিনা তা যাচাই করুন
     */
    public static function isCoroutine(): bool;

}

Coroutine সম্পর্কে

সুবিধা

PHP coroutine চালু করার বৃহত্তম সুবিধা হলো এটি সিঙ্ক্রোনাস পদ্ধতিতে অ্যাসিনক্রোনাস কোড লেখা সম্ভব করে, যা কলব্যাক নরক নিষ্ক্রিয় করে এবং কোডের পাঠযোগ্যতা এবং রক্ষণাবেক্ষণ বাড়ায়।
Coroutine IO ঘনিষ্ঠ ব্যবসার স্থিতিস্থাপকতা বাড়াতে পারে, কম প্রক্রিয়া ব্যবহার করে বৃহত্তর থ্রুপুট সরবরাহ করতে পারে।

অসুবিধা

কিন্তু coroutine চালুর পর ডেভেলপারদের সবসময় গ্লোবাল ভেরিয়েবল দূষণ, রিসোর্স প্রতিযোগিতা, তৃতীয় পক্ষের লাইব্রেরি পরিবর্তন ইত্যাদি সমস্যা নিয়ে সতর্ক থাকতে হবে, রক্ষণাবেক্ষণের খরচ বৃদ্ধি পায় এবং মানসিক চাপ স্পষ্টভাবে বেড়ে যায়।

Coroutine চালুর ফলে coroutine তৈরি, সময়সূচী, ধ্বংস, সংযোগ পুল ইত্যাদির জন্য অতিরিক্ত খরচ হয়।
প্রচুর চাপ পরীক্ষার তথ্যের মাধ্যমে দেখা যায়, CPU পুরোপুরি ব্যবহৃত হলে, coroutine চালুর পর সীমান্ত কার্যকারিতা অবরুদ্ধ IO এর তুলনায় প্রায় 10%-20% কমে যায়।