Swoole에서 사용되는 코루틴은 주로 스레드의 경쟁적 리소스를 협업 작업으로 변환하는 데 사용됩니다. 코루틴은 간단히 말해서 더 가벼운 스레드인 스레드로 이해될 수 있습니다. 그러나 코루틴은 멀티 코어 CPU를 활용할 수 없으며 적용 가능합니다. IO 집약적인 작업, 동시성이 높은 서비스 등을 처리하는 데 사용됩니다.
이 튜토리얼의 운영 환경: Windows 10 시스템, Swoole 4 버전, DELL G3 컴퓨터
Swoole에서 코루틴을 사용하나요?
코루틴이 무엇인가요? 프로세스는 단순히 스레드로 이해될 수 있지만 이 스레드는 사용자 모드에 있으며 운영 체제의 참여가 필요하지 않습니다. 스레드와 달리 코루틴은 멀티 코어를 활용할 수 없습니다. CPU 멀티 코어 CPU를 활용하려면 Swoole의 멀티 프로세스 모델을 활용해야 합니다.
코루틴의 기능
개발자는 동기 코드 작성을 사용하여 전혀 인식하지 않고도 비동기 IO의 효과와 성능을 달성할 수 있으며, 기존 비동기 콜백으로 인해 발생하는 개별 코드 로직과 다층 콜백으로 인해 발생하는 코드를 피할 수 있습니다. 유지하기 위해.
동시에, 하단 레이어는 코루틴을 캡슐화하기 때문에 기존 PHP 레이어 코루틴 프레임워크와 비교하여 개발자는 코루틴 IO 작업을 식별하기 위해 Yield 키워드를 사용할 필요가 없습니다. Yield의 의미와 각 호출에 대한 깊은 이해 모든 1단계 호출을 Yield로 수정하여 개발 효율성을 크게 향상시킵니다. 코루틴은 IO가 차단될 때 자동으로 예약되어 IO 차단으로 인한 시간 손실을 줄이기 때문에 IO 집약적인 애플리케이션에 적합합니다. 10,000번 수면, 10,000번 파일 읽기, 쓰기, 확인 및 삭제, PDO 및 MySQLi를 사용하여 데이터베이스와 10,000번 통신, TCP 서버 생성 및 여러 클라이언트가 서로 10,000번 통신, UDP 서버 및 여러 클라이언트 생성 10,000번 소통... 모든 것이 1초 안에 한 과정으로 완벽하게 완료됩니다!적용 가능한 시나리오
플래시 세일 시스템, 고성능 API 인터페이스, RPC 서버, 연결 풀, IM 채팅, 게임 서버, 사물 인터넷, 메시지 서버 등과 같은 높은 동시성 서비스.
예제 1:
다음 코드와 같이 사용자는 go 함수를 통해 코루틴을 생성하여 동시 실행을 달성할 수 있습니다.
go(function () { echo "one" . PHP_EOL; }); go(function () { echo "two" . PHP_EOL; }); go(function () { echo "three" . PHP_EOL; });go가 나타날 때마다 맨 아래 레이어는 프로그램 후에 자동으로 코루틴을 생성합니다.
예제 2:
클라이언트 요청은 코루틴을 통해 동시에 실행될 수 있으며, 코루틴으로 인한 IO 차단 시 스케줄링을 사용하여 고성능 서비스를 구현합니다. 다음은 연기 메커니즘입니다. 요청 동시 실행 구현:
go(function () { // 协程 MySQL 客户端 $mysql = new Swoole\Coroutine\MySQL(); $mysql->connect([ 'host' => '172.17.0.1', 'user' => 'root', 'password' => 'root', 'database' => 'swoole', ]); $mysql->setDefer(); $mysql->query('select sleep(2);'); print_r("time1: " . time() . PHP_EOL); // 协程 Redis 客户端 $redis = new Swoole\Coroutine\Redis(); $redis->connect('172.17.0.1', 6379); $redis->setDefer(); $redis->set('name', '张三'); $redis->recv(); print_r("time2: " . time() . PHP_EOL); $redis->setDefer(); $redis->get('name'); $res1 = $mysql->recv(); $res2 = $redis->recv(); print_r(['result1: ' => $res1[0]['sleep'], 'result2: ' => $res2, 'time3: ' => time()]); });위 코드를 예로 들면, defer 모드에서는 여러 클라이언트의 요청 응답이 동시에 발생한다는 것을 간단히 이해할 수 있습니다. setDefer(true)를 설정하면 Redis를 통해 요청이 시작됩니다. 또는 MySQL 클라이언트는 더 이상 서버가 결과를 반환할 때까지 기다리지 않고 요청을 보낸 후 즉시 true를 반환합니다. 그 후에는 계속해서 다른 Redis 및 MySQL 요청을 시작할 수 있으며 마지막으로 recv() 메서드를 사용하여 응답 콘텐츠를 받을 수 있습니다.
Notes
동일한 코루틴 클라이언트가 여러 코루틴 간에 공유되는 경우 코루틴은 요청을 동시에 처리하므로 동시에 클라이언트 연결을 공유하면 많은 요청이 병렬로 처리될 수 있습니다. 서로 다른 코루틴 간에 데이터 혼란이 발생할 수 있습니다.
코루틴은 원래 비동기 로직을 동기화하지만 코루틴 전환은 암묵적으로 발생하므로 코루틴 전환 전후에 전역 변수와 정적 변수의 일관성을 보장할 수 없습니다. 추천 학습:swoole 튜토리얼
위 내용은 코루틴은 swoole에 사용되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!