Home  >  Article  >  Backend Development  >  What is php coroutine

What is php coroutine

(*-*)浩
(*-*)浩Original
2019-09-16 13:32:552723browse

The coroutine requires the currently running task to automatically pass control back to the scheduler so that other tasks can continue to run. This is exactly the opposite of preemptive multitasking, where the scheduler can forcefully interrupt running tasks regardless of its intention.

What is php coroutine

#If you only rely on the program to automatically hand over control, some malicious programs will easily occupy all the CPU time without sharing it with other tasks.

The scheduling of the coroutine is implemented by the coroutine itself actively giving up control to the outer scheduler.

Going back to the example of the generator implementing the xrange function, the entire execution process can be alternated Use the following figure to represent it:

Coroutines can be understood as pure user-mode threads, which perform task switching through collaboration rather than preemption. (Recommended learning: PHP programming from entry to proficiency)

Compared with processes or threads, all operations of coroutines can be performed in user mode instead of the operating system kernel Stateful completion, creation and switching cost is very low.

Simply put, coroutine provides a method to interrupt the execution of the current task, save the current local variables, and restore the current local variables to continue execution next time.

Coroutine Coroutine support is based on the generator, adding the function of sending data back to the generator (the caller sends data to the called generator function). This brings the generator to The one-way communication of the caller is transformed into a two-way communication between the two.

Code after using the coroutine

First draft, manual adjustment Generator execution

# 本代码手动调整了进程执行代码的顺序,当然本代码实现不用协程也可以,只是利用本流程说明协程作用
# 生成器给了我们函数中断,协程[生成器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

The above is the detailed content of What is php coroutine. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn