어떻게 PHP 로 다 중 스 레 드 프로 그래 밍 을 실현 합 니까?

다 중 스 레 드
스 레 드
먼저 스 레 드 를 말씀 드 리 겠 습 니 다.
스 레 드(thread)는 운영 체제 가 연산 스케줄 을 할 수 있 는 가장 작은 단위 이다.그것 은 프로 세 스 에 포함 되 어 있 으 며 프로 세 스 의 실제 운영 단위 입 니 다.하나의 스 레 드 는 프로 세 스 의 단일 순서 로 흐름 을 제어 하 는 것 을 말 합 니 다.한 프로 세 스 에서 여러 스 레 드 를 병행 할 수 있 고 모든 스 레 드 는 서로 다른 작업 을 병행 할 수 있 습 니 다.
다 중 스 레 드 를 사용 하 는 것 은 주로 실행 효율 에 있어 서 매우 큰 장점 을 가지 기 때문이다.스 레 드 는 운영 체제 가 스케줄 링 을 할 수 있 는 가장 작은 단위 이기 때문이다.
  • 다 중 스 레 드 프로그램 이 단일 스 레 드 프로그램 보다 운영 체제 에 배 치 될 확률 이 높 기 때문에 다 중 스 레 드 프로그램 은 보통 단일 스 레 드 프로그램 보다 효율 적 입 니 다.
  • 다 중 스 레 드 프로그램의 여러 스 레 드 는 다 중 핵 CPU 의 여러 핵심 에서 동시에 운행 할 수 있 고 기계 다 핵 의 장점 을 완전히 발휘 할 수 있다.
  • 다 중 프로 세 스 프로그램 을 비교 하면 다 중 스 레 드 는 다음 과 같은 특징 이 있 습 니 다.
  • 스 레 드 의 생 성과 전환 시스템 의 비용 이 프로 세 스 보다 적 기 때문에 어느 정도 에 다 중 프로 세 스 보다 효율 적 입 니 다.
  • 스 레 드 는 타고 난 공유 메모리 공간 으로 스 레 드 간 의 통신 이 더욱 간단 하고 프로 세 스 IPC 가 새로운 복잡 도 를 도입 하 는 것 을 피한다.
  • 적용 필드
    다 중 스 레 드 의 최적화 가 매우 많 지만 뇌 가 없 는 다 중 스 레 드 를 사용 하면 프로그램의 집행 효율 을 향상 시 킬 수 없다.스 레 드 의 생 성과 소각,문맥 전환,스 레 드 동기 화 등 도 성능 손실 이 있 기 때문에 순서대로 실행 하 는 코드 보다 시간 이 더 많이 걸 릴 수 있다.예:
    sumSmall 은 1 누적 에서 50000 까지 의 함수 입 니 다.

    위의 그림 은 메 인 스 레 드 에서 세 번 의 sumSmall 과 세 개의 스 레 드 를 각각 sumSmall 로 실행 한 다음 에 결 과 를 한 스 레 드 로 동기 화 하 는 시간 을 비교 하면 우 리 는 메 인 스 레 드 에서 만 실행 하 는 시간 이 오히려 더 짧 고 세 개의 스 레 드 생 성,전환,동기 화 시간 이 스 레 드 비동기 실행 보다 훨씬 절약 하 는 시간 을 발견 할 수 있다.
    한편,함수 sum Large 는 1 에서 5000000 까지 누적 되 고 다음 그림 은 같은 스 레 드 에서 세 번 과 세 개의 스 레 드 를 실행 하 는 데 걸 리 는 시간 입 니 다.

    이번에 다 중 스 레 드 가 마침내 효율 적 인 우 위 를 가지 게 되 었 다.
    다 중 스 레 드 를 사용 할 지 여 부 는 구체 적 인 수요 에 따라 정 해 야 하 며 일반적으로 다음 과 같은 두 가지 상황 을 고려 해 야 한다.
  • I/O 차단 은 운영 체제 에 작업 스케줄 링 을 일 으 켜 현재 작업 을 막 기 때문에 코드 에 I/O 가 많은 경우 다 중 스 레 드 를 사용 할 때 코드 를 병행 할 수 있 습 니 다.예 를 들 어 블록 전 체 를 여러 번 읽 거나 여러 개의 네트워크 자원 을 요청 합 니 다.
  • 다 중 스 레 드 는 CPU 를 충분히 이용 할 수 있 기 때문에 여러 곳 의 큰 계 산 량 코드 가 있 을 때 도 다 중 스 레 드 를 사용 하여 병행 할 수 있 습 니 다.예 를 들 어 위의 다음 예 와 같 습 니 다.
  • PHP 의 다 중 스 레 드
    PHP 는 기본적으로 다 중 스 레 드 를 지원 하지 않 습 니 다.다 중 스 레 드 확장 을 사용 하려 면 pthread 확장 을 설치 해 야 합 니 다.pthread 확장 을 설치 하려 면--enable-maintainer-zts 매개 변 수 를 사용 하여 PHP 를 다시 컴 파일 해 야 합 니 다.이 매개 변 수 는 PHP 를 컴 파일 할 때 스 레 드 보안 방식 을 사용 해 야 합 니 다.
    스 레 드 보안
    다 중 스 레 드 는 프로그램 을 불안 하 게 만 드 는 요소 입 니 다.다 중 스 레 드 를 사용 하기 전에 먼저 스 레 드 안전 문 제 를 고려 해 야 합 니 다.
    스 레 드 안전:스 레 드 안전 은 프로 그래 밍 에서 의 용어 로 특정한 함수,함수 라 이브 러 리 가 다 중 스 레 드 환경 에서 호출 될 때 여러 스 레 드 간 의 공유 변 수 를 정확하게 처리 하여 프로그램 기능 을 정확하게 완성 할 수 있 습 니 다.
    전통 적 인 다 중 스 레 드 에서 여러 스 레 드 가 변 수 를 공유 하기 때문에 다음 과 같은 문제 가 발생 할 수 있 습 니 다.
    1.전역 배열$arr=array('a')가 존재 합 니 다.
    2.A 스 레 드 에서 배열 의 길 이 를 1 로 가 져 옵 니 다.
    3.B 스 레 드 에서 배열 의 길 이 를 1 로 가 져 옵 니 다.
    4.A 스 레 드 pop 에서 배열 요소$a=arraypop($arr); $a = 'a';;
    5.B 스 레 드 도 pop 배열 요소$b=arraypop($arr); $a = null;;
    6.이때 B 스 레 드 에 이상 한 사건 이 발생 했 습 니 다.배열 의 길이 가 0 보다 크 거나 pop 에서 물건 이 나 오지 않 았 습 니 다.
    PHP 구현
    PHP 가 실현 하 는 스 레 드 보안 은 주로 TSRM 체 제 를 사용 하여 전체 변수 와 정적 변 수 를 격 리 시 켰 고 전체 변수 와 정적 변 수 를 모든 스 레 드 에 복사 했다.각 스 레 드 는 모두 메 인 스 레 드 의 백업 을 사용 하여 변수 충돌 을 피 했 고 스 레 드 안전 문제 가 발생 하지 않 았 다.
    PHP 는 다 중 스 레 드 에 대한 패 키 징 으로 스 레 드 안전 을 보장 합 니 다.프로그래머 는 전체 변수 에 각종 자 물 쇠 를 추가 하여 읽 기와 쓰기 충돌 을 피 하 는 동시에 오류 의 기 회 를 줄 이 고 쓴 코드 가 더욱 안전 합 니 다.
    그러나 이 로 인해 서브 스 레 드 가 실행 되 기 시작 하면 메 인 스 레 드 의 운행 디 테 일 을 조정 할 수 없고 스 레 드 는 어느 정도 에 스 레 드 간 에 전체 변 수 를 통 해 메 시 지 를 전달 하 는 능력 을 잃 었 다.
    또한 PHP 가 스 레 드 보안 옵션 을 켜 면 TSRM 메커니즘 을 사용 하여 변 수 를 할당 하고 사용 할 때 추가 손실 이 발생 하기 때문에 다 중 스 레 드 가 필요 없 는 PHP 환경 에서 PHP 의 ZTS(비 스 레 드 보안)버 전 을 사용 하면 됩 니 다.
    유형 과 방법
    PHP 는 스 레 드 를 Thread 클래스 로 봉 인 했 습 니 다.스 레 드 의 생 성 은 하나의 스 레 드 대상 을 예화 하여 이 루어 집 니 다.클래스 의 패 키 징 성 으로 인해 변수의 사용 은 구조 함수 로 만 들 어 갈 수 있 고 스 레 드 연산 결 과 는 클래스 변 수 를 통 해 전달 되 어야 합 니 다.
    다음은 자주 사용 하 는 Thread 클래스 방법 을 소개 합 니 다.
  • run():이 방법 은 추상 적 인 방법 으로 모든 스 레 드 가 이 방법 을 실현 해 야 합 니 다.스 레 드 가 실 행 된 후에 이 방법 중의 코드 는 자동 으로 실 행 됩 니 다.
  • start():메 인 스 레 드 에서 이 방법 을 호출 하여 스 레 드 를 시작 합 니 다.
  • join():각 스 레 드 는 주 스 레 드 에 비해 비동기 로 실 행 됩 니 다.이 방법 을 사용 하면 스 레 드 가 끝 날 때 까지 기다 릴 것 입 니 다.
  • kill():강제 스 레 드 종료;
  • isRunning():스 레 드 의 운행 상 태 를 되 돌려 줍 니 다.스 레 드 가 run()방법의 코드 를 실행 하고 있 을 때 true 로 돌아 갑 니 다.
  • 스 레 드 가 안전 하기 때문에 PHP 의 다 중 스 레 드 가 실 행 된 후에 공유 메모리 공간 을 통 해 통신 할 수 없고 스 레 드 도 스 레 드 간 통신 을 통 해 재 활용 할 수 없 기 때문에 PHP 의'스 레 드 풀'은 의미 가 없다 고 생각 합 니 다.확장 내 자체 테이프Pool클래스 는 다 중 스 레 드 배분 관리 클래스 로 더 이상 소개 하지 않 습 니 다.
    인 스 턴 스 코드
    다음은 인 터 페 이 스 를 요청 하 는 스 레 드 클래스 입 니 다.다음은 두 개의 다 중 스 레 드 의 응용 인 스 턴 스 를 작성 합 니 다.
    
    class Request extends Thread {
        public $url;
        public $response;
        public function __construct($url) {
            $this->url = $url;
        }
        public function run() {
            $this->response = file_get_contents($this->url);
        }
    }
    비동기 요청
    동기 화 요청 을 여러 스 레 드 비동기 호출 로 나 누 어 프로그램의 운행 효율 을 향상 시 킵 니 다.
    
    $chG = new Request("www.google.com");
    $chB = new Request("www.baidu.com");
    $chG ->start();
    $chB ->start();
    $chG->join();
    $chB->join();
    
    $gl = $chG->response;
    $bd = $chB->response;
    시간 초과 제어
    우연히 회사 사이트 의 한 홈 페이지 에 있 는 내용 을 발 견 했 을 때 가끔 없 었 고 구체 적 인 실현 을 몰 랐 다.그러나 이것 은 나 에 게 다 중 스 레 드 를 사용 하 는 영감 을 주 었 다.스 레 드 이 보 를 이용 하여 빠 른 실패 와 시간 초과 통 제 를 실현 했다.
    우리 가 curl 을 사용 하여 어떤 주 소 를 요청 할 때 CURLOPT 를 통 해CONNECTTIMEOUT / CURLOPT_TIMEOUT 매개 변 수 는 각각 curl 의 연결 시간 초과 와 데이터 읽 기 시간 초 과 를 설정 하지만 전체 시간 초과 가 제어 되 지 않 습 니 다.또한 데이터 베 이 스 를 조회 할 때 시간 초과 설정 을 할 수 없습니다(새 고 블 로그:MySQL 에 조회 시간 초과 설정).
    이 때 우 리 는 다 중 스 레 드 를 빌려 이 기능 을 실현 할 수 있 습 니 다.스 레 드 류 의 start()방법 을 실행 한 후에 join()방법 을 사용 하지 않 고 스 레 드 를 비동기 상태 에 있 게 하고 메 인 스 레 드 의 실행 을 막 지 않 습 니 다.
    이때 메 인 스 레 드 는 플래그 십 에 해당 하 며,각 서브 스 레 드 는 순항 함 에 해당 하 며,플래그 십 이 어 딘 가 에 도착 한 후 순항 함 도 돌아 오 기 를 기다 릴 필요 가 없 으 며,일정 시간 을 기 다 렸 다가 떠 나 면 돼 순항 함 이 예상 치 못 할 때 플래그 십 이 하 얗 게 비어 있 는 등 을 피 할 수 있다.
    코드:
    
    $chG = new Request("www.google.com");
    $chB = new Request("www.baidu.com");
    $chG->start();
    $chB->start();
    $chB->join();
    //     chG  join  
    
    sleep(1); // sleep          
    $gl = $chG->response;
    $bd = $chB->response;
    $bd->kill();
    if (!$gl) {
        $gl = ""; //     ,       $gl     
    }
    총결산
    PHP 가 다 중 스 레 드 에 대한 봉(yan)장 착(ge)은 스 레 드 를 사용 하 는 것 이 매우 불쾌 합 니 다.안전 하고 PHP 가 간단 하고 사용 하기 쉬 운 일 관 된 스타일 을 유지 하지만 다 중 스 레 드 능력 을 완전히 발휘 할 수 는 없다.
    이상 은 어떻게 PHP 로 다 중 스 레 드 프로 그래 밍 을 실현 하 는 지 에 대한 상세 한 내용 입 니 다.더 많은 PHP 로 다 중 스 레 드 프로 그래 밍 을 실현 하 는 데 관 한 자 료 는 우리 의 다른 관련 글 에 관심 을 가 져 주 십시오!

    좋은 웹페이지 즐겨찾기