Swoole은 최근 고성능 비동기식 네트워크 프레임워크로 개발자들의 사랑을 받으며 다양한 분야에서 널리 사용되고 있습니다. Swoole을 사용하는 과정에서 코루틴은 비동기 코드를 동기 방식으로 작성할 수 있게 해주는 매우 중요한 개념 중 하나입니다. 이 기사에서는 Swoole에서 캐싱 작업을 위해 코루틴을 사용하는 방법을 소개하고 실용적인 코드 예제를 제공합니다.
1. 코루틴이란 무엇입니까? 코루틴은 사용자 모드의 경량 스레드로, 시스템 스레드의 소비 및 전환을 방지하여 코드를 통해 관리됩니다. Swoole에서는 코루틴을 사용하여 데이터베이스 연결, Redis 작업 등과 같은 I/O 집약적인 네트워크 작업 문제를 해결할 수 있습니다. 코루틴은 I/O 작업이 발생하면 사전에 제어를 포기하고 실행을 다시 시작하기 전에 작업이 완료될 때까지 기다릴 수 있습니다.
2. Swoole의 코루틴 지원
Swoole은 버전 1.8.0부터 코루틴 지원을 도입했습니다. 이 지원은 코루틴, go, defer, 채널 등을 포함한 코루틴 스케줄링을 구현하는 일련의 API를 제공합니다.
1. 코루틴
코루틴은 함수를 코루틴으로 변환할 수 있게 해줍니다. 예:
function test() { echo "start "; Coroutine::sleep(1); echo "end "; } Coroutine::create('test'); echo "hello ";
이 예에서는 테스트 함수를 코루틴으로 변환하고 Coroutine::create를 사용합니다. () 코루틴을 생성합니다. 코루틴에서는 Coroutine::sleep()을 사용하여 I/O 작업을 시뮬레이션합니다. 이 작업을 수행하면 코루틴이 1초 동안 일시 중지된 다음 다시 시작되고 계속해서 "end"가 출력됩니다. 마지막으로 코루틴의 비동기 특성을 보여주는 "hello"가 출력됩니다.
2. go
go는 함수를 코루틴으로 실행할 수 있게 해주는 특수 함수입니다. 예:
go(function(){ echo "hello "; Coroutine::sleep(1); echo "world "; }); echo "start ";
이 예제에서는 go()를 사용하여 익명 함수를 실행합니다. 함수에서는 "hello"를 출력하고 1초 동안 멈춘 후 "world"를 차례로 출력합니다. 마지막으로 "start"가 출력되는데, 이는 코루틴을 사용하여 이 함수를 동시에 실행한다는 것을 증명합니다.
3. defer
defer를 사용하면 코루틴 종료 시 데이터베이스 연결 닫기, 리소스 해제 등과 같은 일부 정리 작업을 수행할 수 있습니다. 사용법은 다음과 같습니다.
go(function(){ $db = new Redis(); $db->connect('127.0.0.1', 6379); defer(function() use ($db) { $db->close(); }); $db->set('key', 'value'); Coroutine::sleep(1); $value = $db->get('key'); echo $value." "; });
이 예에서는 defer를 사용합니다. 코루틴의 끝 Redis 연결이 닫힙니다. defer를 사용하지 않으면 코루틴이 종료될 때 연결을 닫는 것을 잊어버려 연결 수가 누출될 수 있습니다.
4. Channel
channel은 Swoole에서 제공하는 파이프와 같은 메커니즘으로, 다음과 같이 여러 코루틴 간의 통신을 허용합니다.
$chan = new CoroutineChannel(1); go(function() use($chan) { $data = Coroutine::getuid(); $chan->push($data); }); $data = $chan->pop(); echo $data." ";
이 예에서는 용량이 1인 채널을 만든 다음 데이터를 코루틴의 채널에 보내고 다른 코루틴의 채널에 있는 데이터를 팝하여 출력합니다. 채널을 사용하면 코루틴 간에 데이터를 전송하고 공동 작업 처리를 완료할 수 있습니다.
3. 코루틴 연산 캐시
실제 개발에서 캐시는 데이터베이스 부담을 줄이고 캐시 적중을 통해 데이터 읽기 속도를 높일 수 있는 매우 중요한 구성 요소입니다. Swoole에서는 Redis와 같은 인메모리 데이터베이스를 사용하여 캐싱을 구현하는 동시에 코루틴을 사용하여 캐시의 동시성 성능을 향상시킬 수 있습니다.
1. Redis에 연결
Swoole의 코루틴 Redis 클라이언트를 사용하여 Redis 데이터베이스에 연결하고 동시에 작동합니다.
$redis = new SwooleCoroutineRedis(); $redis->connect('127.0.0.1', 6379); go(function () use ($redis) { $redis->set('name', 'Bob'); $name = $redis->get('name'); echo "name=$name "; }); go(function () use ($redis) { $redis->set('age', 18); $age = $redis->get('age'); echo "age=$age "; }); SwooleCoroutine::sleep(1);
이 예에서는 Swoole의 코루틴 Redis 클라이언트를 사용하여 Redis 데이터베이스에 연결합니다. 그런 다음 코루틴 형태로 읽기 및 쓰기 작업을 수행하고 코루틴 내에서 관련 결과를 출력했습니다. 마지막으로 SwooleCoroutine::sleep()을 사용하여 코루틴이 완료될 때까지 일정 시간 동안 기다립니다. 유사한 방식으로 다른 인메모리 데이터베이스에 연결하고 작동할 수 있습니다.
2. 캐시 작업
Redis에 연결한 후 일련의 캐시 명령을 사용하여 작업할 수 있습니다. 예를 들어 캐시된 데이터를 설정하려면 set() 메서드를 사용할 수 있습니다.
$redis->set('key', 'value');
여기서 'key'는 캐시된 데이터의 키이고 'value'는 캐시된 데이터의 값입니다. 캐시된 데이터를 읽으려면 get() 메서드를 사용할 수 있습니다.
$value = $redis->get('key');
코루틴에서는 위 명령을 사용하여 동시에 작동할 수 있습니다. 예:
go(function() use($redis){ $redis->set('key1', 'value1'); $value1 = $redis->get('key1'); echo "key1=$value1 "; }); go(function() use($redis){ $redis->set('key2', 'value2'); $value2 = $redis->get('key2'); echo "key2=$value2 "; }); SwooleCoroutine::sleep(1);
이 예에서는 두 개의 코루틴에 각각 두 개의 캐시된 데이터를 설정하고 읽은 다음 동시에 작동했습니다. 이는 코루틴이 캐시된 데이터의 동시성 성능을 향상시킬 수 있음을 입증합니다.
3. 캐시 및 MySQL 작업
실제 응용 프로그램에서는 일반적으로 캐시에서 데이터를 먼저 읽고, 캐시가 없으면 MySQL에서 읽는 등의 작업을 위해 캐시와 MySQL을 결합해야 합니다. Swoole의 코루틴 개발에서는 다음과 유사한 방법을 사용하여 이 작업을 구현할 수 있습니다.
$redis = new SwooleCoroutineRedis(); $redis->connect('127.0.0.1', 6379); $mysql = new SwooleCoroutineMySQL(); $mysql->connect([ 'host' => '127.0.0.1', 'port' => 3306, 'user' => 'root', 'password' => '123456', 'database' => 'test', ]); go(function() use($redis, $mysql) { $name = $redis->get('name'); if($name === false) { $result = $mysql->query('select * from user where id=1'); if(!empty($result)) { $name = $result[0]['name']; $redis->set('name', $name); } } echo "name=$name "; }); go(function() use($redis, $mysql) { $age = $redis->get('age'); if($age === false) { $result = $mysql->query('select * from user where id=1'); if(!empty($result)) { $age = $result[0]['age']; $redis->set('age', $age); } } echo "age=$age "; }); SwooleCoroutine::sleep(1);
이 예에서는 코루틴 작업 방법을 사용합니다. 캐시에 없는 경우 먼저 캐시에서 데이터를 읽으려고 시도합니다. , MySQL에서 데이터를 읽습니다. MySQL을 운영할 때 스레드 차단을 방지하고 효율성을 높이기 위해 코루틴도 사용합니다. 마지막으로 이 작업 방법의 정확성을 증명하기 위해 읽기 결과를 인쇄했습니다.
위는 Swoole에서 캐시 작업을 위해 코루틴을 사용하는 구체적인 구현 방법입니다. 코루틴은 캐시 작업의 효율성과 동시성 성능을 향상시킬 수 있으며 MySQL과 같은 다른 작업과 결합될 수 있습니다. 실제 개발에서는 위의 방법으로 연습하고 실제 상황에 따라 조정과 변경을 할 수 있습니다.
위 내용은 Swoole의 실제 작동: 캐싱 작업에 코루틴을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!