>  기사  >  백엔드 개발  >  Go 작업 풀을 구현하기 위해 errgroup을 사용하면 고루틴이 중단됩니다.

Go 작업 풀을 구현하기 위해 errgroup을 사용하면 고루틴이 중단됩니다.

王林
王林앞으로
2024-02-08 21:09:181019검색

使用 errgroup 实现 Go 工作池,goroutines 卡住

오늘 PHP Apple 편집자는 errgroup을 사용하여 Go 작업 풀을 구현하는 방법을 소개합니다. 이는 고루틴이 멈추는 문제를 해결합니다. 동시 프로그래밍에서는 고루틴을 사용하여 효율적인 동시 처리를 달성할 수 있지만, 특정 고루틴에서 오류나 멈춤이 발생하면 전체 프로그램의 실행에 영향을 미치게 됩니다. errgroup 패키지를 사용하면 고루틴 실행을 우아하게 관리하고 오류 발생 시 오류를 처리하여 프로그램의 안정성과 신뢰성을 보장할 수 있습니다. 이것이 어떻게 구현되는지 살펴보겠습니다.

질문 내용


어떤 고루틴에서도 오류를 잡을 수 있도록 errgroup을 사용하여 작업자 풀 패턴을 구현했습니다. 내 세부정보는 다음과 같습니다.

으아악

이후 작업자 기능의 구현은 다음과 같습니다.

으아악

calluserapi는 403 금지된 오류를 반환합니다. 이는 g.wait()를 호출해야 하며 nil이 아닌 오류가 발생하면 모든 고루틴을 즉시 중지해야 합니다. 하지만 여기서는 그렇지 않습니다. g.wait()는 호출되지 않습니다.


Solution


몇 가지 문제가 있습니다:

  • 루프

    으아악

    직원이 각 사용자에게 결과를 보낼 때까지 기다립니다. calluserapi가 오류를 반환하는 경우에는 이런 일이 발생하지 않습니다.

  • 근로자는 jobs폐쇄된 상황을 처리하지 않습니다.

다음 코드는 이 두 가지 문제를 해결할 수 있습니다.

유형을 선언하고 처리할 사용자와 결과를 저장할 위치를 지정하세요.

으아악

이 새로운 유형을 사용하려면 작업자 스레드를 수정하세요. 또한 jobs가 닫힐 때 종료되도록 작업자를 수정합니다.

으아악

메인 고루틴에서 이들을 함께 붙입니다:

으아악

위 내용은 Go 작업 풀을 구현하기 위해 errgroup을 사용하면 고루틴이 중단됩니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제