코루틴에서는 다른 작업이 계속 실행될 수 있도록 현재 실행 중인 작업이 자동으로 스케줄러에 제어를 다시 전달해야 합니다. 이는 스케줄러가 의도와 관계없이 실행 중인 작업을 강제로 중단할 수 있는 선점형 멀티태스킹의 정반대입니다.
제어권을 자동으로 넘기는 프로그램에만 의존한다면 일부 악성 프로그램은 다른 작업과 공유하지 않고 모든 CPU 시간을 쉽게 차지할 것입니다.
코루틴의 스케줄링은 코루틴 자체가 외부 스케줄러에 대한 제어 권한을 적극적으로 포기함으로써 구현됩니다.
xrange 함수를 구현하는 생성기의 예로 돌아가면 전체 실행 프로세스의 교대를 다음과 같이 표현할 수 있습니다. 다음 그림:
코루틴은 선점보다는 협업을 통해 작업을 전환하는 순수한 사용자 모드 스레드로 이해될 수 있습니다. (추천 학습: PHP 프로그래밍 초보부터 능숙까지 )
프로세스나 스레드에 비해 코루틴의 모든 작업은 운영체제 커널 모드가 아닌 사용자 모드에서 완료할 수 있으며 생성 및 전환 소모량이 매우 적습니다. .
간단히 말해서 코루틴은 현재 작업의 실행을 중단하고, 현재 지역 변수를 저장하고, 다음 번 실행을 계속하기 위해 현재 지역 변수를 복원하는 방법을 제공합니다.
코루틴 코루틴 지원은 생성기를 기반으로 생성기로 데이터를 다시 보내는 기능을 추가합니다(호출자는 호출된 생성기 함수에 데이터를 보냅니다). 이는 생성기를 호출자의 단일 변경 통신에 넣습니다. 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
위 내용은 PHP 코루틴이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!