>  기사  >  PHP 프레임워크  >  코루틴은 swoole에 사용되나요?

코루틴은 swoole에 사용되나요?

WBOY
WBOY원래의
2022-06-16 17:29:572515검색

Swoole에서 사용되는 코루틴은 주로 스레드의 경쟁적 리소스를 협업 작업으로 변환하는 데 사용됩니다. 코루틴은 간단히 말해서 더 가벼운 스레드인 스레드로 이해될 수 있습니다. 그러나 코루틴은 멀티 코어 CPU를 활용할 수 없으며 적용 가능합니다. IO 집약적인 작업, 동시성이 높은 서비스 등을 처리하는 데 사용됩니다.

코루틴은 swoole에 사용되나요?

이 튜토리얼의 운영 환경: Windows 10 시스템, Swoole 4 버전, DELL G3 컴퓨터

Swoole에서 코루틴을 사용하나요?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.