이 글에서는 주로 PHP의 코루틴과 차단에 대한 이해와 생각을 소개합니다. 이 글에서는 PHP를 배우거나 사용할 수 있는 특정 참고 학습 가치를 아래에서 확인할 수 있습니다. .함께 배워봅시다.
머리말
이 글은 주로 PHP의 코루틴과 블로킹에 대한 이해와 생각을 소개하고 참고와 학습을 위해 공유합니다. 아래에서 할 말은 많지 않으나 자세한 소개를 살펴보겠습니다.
프로세스, 스레드, 코루틴
프로세스, 스레드, 코루틴에 대한 매우 상세하고 풍부한 블로그나 학습 리소스가 있으므로 여기서는 이에 대해 간략히 소개하지 않겠습니다.
프로세스에는 자체 독립적인 힙과 스택이 있으며 힙이나 스택을 공유하지 않습니다. 프로세스는 운영 체제에 의해 예약됩니다.
스레드에는 자체 독립 스택과 공유 힙이 있습니다. 힙은 공유되지만 스택은 공유되지 않습니다. 스레드도 운영 체제에 의해 예약됩니다.
코루틴은 스레드처럼 힙을 공유하지만 스택은 공유하지 않습니다. 코루틴은 프로그래머가 코루틴 코드에서 명시적으로 예약합니다.
PHP에서 코루틴 Yield의 기본 구현
Yield의 기본 구현은 생성기 클래스이고 반복자 클래스는 반복자 인터페이스의 구현입니다.
Generator implements Iterator { public mixed current ( void ) // 返回当前产生的值 public mixed key ( void ) // 返回当前产生的键 public void next ( void ) // 生成器继续执行 public void rewind ( void ) // 重置迭代器,如果迭代已经开始了,这里会抛出一个异常。 // renwind的执行将会导致第一个yield被执行, 并且忽略了他的返回值. public mixed send ( mixed $value ) // 向生成器中传入一个值,并且当做 yield 表达式的结果,然后继续执行生成器。如果当这个方法被调用时,生成器 // 不在 yield 表达式,那么在传入值之前,它会先运行到第一个 yield 表达式。 public void throw ( Exception $exception ) // 向生成器中抛入一个异常 public bool valid ( void ) // 检查迭代器是否被关闭 public void __wakeup ( void ) // 序列化回调,抛出一个异常以表示生成器不能被序列化。 }
The 위의 분석은 PHP 공식 문서를 참조할 수 있습니다.
http://php.net/manual/zh/clas...
이 세부 문서:
http://www.jb51.net/article/39424_all.htm
이를 사용하여 달성합니다. 코루틴 다중 작업 스케줄링을 기반으로 한 예를 제시하고 차단에 대한 내 생각을 이야기하겠습니다.
간단한 예약 실행 작업 사용자 정의의 예:
(이 예는 위의 Brother Niao가 구현한 코루틴 스케줄링 코드에 의존해야 함)
class timer { private $start = 0; // 定时开始时间 private $timer; // 间隔的时间差,单位秒 private $value = 0; // 产生的结果值 private $callback; // 异步回调 private $isEnd = false; // 当前定时器任务是否结束 public function __construct($timer,callable $callback) { $this->start = time(); $this->timer = $timer; $this->callback = $callback; } public function run() { if($this->valid()) { $callback = $this->callback; $callback($this->value ++,$this); $this->start = time(); } } /** * 定时执行检查 */ public function valid() { $end = time(); if($end - $this->start >= $this->timer) { return true; } else { return false; } } public function setEnd($isEnd) { $this->isEnd = $isEnd; } public function getEnd() { return $this->isEnd; } } /** * 模拟阻塞的协程1 * */ function taskObject1() { $timer = new timer(1,function($value,timer $timer) { if($value >= 5) { $timer->setEnd(true); } echo '<br>'.'A '.$value; }); $tid = (yield getTaskId()); while (true) { if($timer->getEnd() == true) { break; } yield $timer->run(); } } /** * 模拟阻塞的协程2 * */ function taskObject2() { $timer = new timer(2,function($value,timer $timer) { if($value >= 3) { $timer->setEnd(true); } echo '<br>'.'B '.$value; }); $tid = (yield getTaskId()); while (true) { if($timer->getEnd() == true) { break; } yield $timer->run(); } } $scheduler = new Scheduler; $scheduler->newTask(taskObject1()); $scheduler->newTask(taskObject2()); $scheduler->run();
위의 구현은 다음과 같습니다.
두 개를 생성합니다. 작업을 병렬로 실행하고 실행 중에 각 작업에 대해 몇 초 동안 차단을 시뮬레이션합니다.
코루틴이 전환될 때 원활한 전환이 가능하며 작업 차단이 서로 영향을 미치지 않습니다.
sleep()
을 호출하면 차단 작업으로 인해 실제로 코루틴 전환도 마찬가지입니다. 그런 다음 코루틴 차단도 시뮬레이션하고 싶지만 실행 가능한지 확인하기 위해 차단을 유발하지 않습니다. PHP 자체는 코루틴 호출을 지원하기 위한 생성기만 제공합니다. 확장에 의존하지 않는 경우 다중 스레드 프로그램 구현 방법을 제공하지 않으며 Java만큼 강력하지 않으며 하위 스레드를 열어 구현할 수 있습니다.
Java의 하위 스레드는 독립적으로 실행되고 서로를 차단하지 않는다는 인상을 받았기 때문에 PHP가 멀티스레딩과 유사한 메커니즘을 구현할 수 있으므로 호출 프로세스 중에 비차단을 달성할 수 있을까요?
이렇게 구현하고 생각하다가 처음에는 오해에 빠졌습니다. 그건 PHP 네이티브 함수인 sleep()
이 막혀서 생긴 오해였습니다. 실제로 논블로킹을 달성합니다. 즉, 비동기식으로 구현하려면 기본 언어에 의존해야 합니다. sleep()
的时候,阻塞任务会阻止协程切换,其实从协程的实现原理上来书也是这么回事。
那么,我也就想模拟协程阻塞,但是不产生阻塞看是否可行。PHP本身只提供了生成器为协程调用提供了支撑,如果不依赖扩展,没有提供多线程的程序实现方式,没有java那么强大,可以开子线程进行实现。
我印象中java的子线程是独立执行且不会相互阻塞的,所以我在想,PHP既然可以实现类似于多线程这样的机制,那么能不能实现调用过程中非阻塞呢?
经过这样一个实现和思考,一开始是陷入了一个误区的,是由于PHP原生函数 sleep()
다음은 실행을 위해 프로그램을 가능한 한 작은 조각으로 자르는 예입니다.
// 一个简单的例子 <?php function xrange($start, $end, $step = 1) { for ($i = $start; $i <= $end; $i += $step) { yield $i; } } foreach (xrange(1, 1000000) as $num) { echo $num, "\n"; }이 예는 range를 사용하여 큰 정수 배열을 생성하는 원래 방법에서 슬라이싱 실행으로 전환합니다. 즉, 탐색할 때 지정된 값을 얻습니다. 코드 관점에서 볼 때 메모리 소비는 이전에 비해 매우 적습니다.
위 내용은 PHP의 코루틴 및 차단 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

뜨거운 주제



