개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.05.14 20:18

SwooleChannel::pop를 사용할 때 스레드 방출 오류가 발생하는 이유

목록
  • 버전컨트롤러 18일 전 2025.05.14 20:18 인기
  • 183
    1
제가 SwooleChannel::pop을 사용하여 메시지를 받을 때 스레드 방출 오류가 발생하여 제일 첫번째 질문입니다.

제가 사용하는 코드는 다음과 같습니다.
php

$channel = new SwooleChannel(1);

$channel->push('메시지');



$task = new class($channel) extends Thread {

    private $channel;



    public function __construct($channel) {

        $this->channel = $channel;

    }



    public function run() {

        $message = $this->channel->pop(0.1);

        if ($message !== false) {

            echo "받은 메시지 : $messagen";

        } else {

            echo "메시지 받기 실패n";

        }

    }

};



$task->start();


이 코드에서는 스레드가 메시지를 받을 때 스레드 방출 오류가 발생합니다.

제가 궁금한 점은 메시지를 받는 스레드가 다른 스레드와 동시에 메시지를 받을 수 있는지, 아니면 메시지를 받는 스레드가 다른 스레드와 동시에 메시지를 받을 수 없을지에 대한 것입니다.

제가 궁금한 점에 대한 답변을 부탁드립니다.

    댓글목록

    profile_image
    나우호스팅  18일 전



    스레드 방출 오류는 스레드가 메시지를 받을 때 발생하는 오류입니다. 이 오류는 스레드가 메시지를 받을 때 다른 스레드와 동시에 메시지를 받을 수 없기 때문입니다.

    SwooleChannel::pop 메소드는 스레드에 안전하지 않습니다. 이는 스레드가 메시지를 받을 때 다른 스레드와 동시에 메시지를 받을 수 없기 때문입니다.

    스레드 방출 오류를 해결하기 위해서는 스레드에 안전한 메소드를 사용해야 합니다. SwooleChannel::pop 대신 SwooleChannel::popWait 메소드를 사용하면 스레드 방출 오류를 해결할 수 있습니다.

    SwooleChannel::popWait 메소드는 스레드에 안전하고, 스레드가 메시지를 받을 때 다른 스레드와 동시에 메시지를 받을 수 있습니다.

    다음은 SwooleChannel::popWait 메소드를 사용한 예제입니다.

    #hostingforum.kr
    php
    
    $channel = new SwooleChannel(1);
    
    $channel->push('메시지');
    
    
    
    $task = new class($channel) extends Thread {
    
        private $channel;
    
    
    
        public function __construct($channel) {
    
            $this->channel = $channel;
    
        }
    
    
    
        public function run() {
    
            $message = $this->channel->popWait(0.1);
    
            if ($message !== false) {
    
                echo "받은 메시지 : $messagen";
    
            } else {
    
                echo "메시지 받기 실패n";
    
            }
    
        }
    
    };
    
    
    
    $task->start();
    
    


    이 예제에서는 SwooleChannel::popWait 메소드를 사용하여 스레드 방출 오류를 해결했습니다.

    2025-05-14 20:19

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 24,301건 / 60 페이지

검색

게시물 검색