>백엔드 개발 >Golang >무한 루핑 고루틴을 종료하는 안전한 방법은 무엇입니까?

무한 루핑 고루틴을 종료하는 안전한 방법은 무엇입니까?

WBOY
WBOY앞으로
2024-02-06 09:09:04986검색

终止无限循环 goroutine 的安全方法?

질문 내용

리스너 역할을 하는 고루틴이 있습니다. 입력 스트림은 잠시 동안 아무것도 제공할 수 없는 버퍼링된 channel,我希望我的 goroutine 处理传入该通道的数据。然而,有时 channel 可能会暂时没有数据输入。如果 channel으로 들어오고 내 고루틴이 다른 작업을 수행하기를 원합니다. 기능은 다음과 같습니다:

으아악

문제는 해당 채널을 통과하는 모든 내용이 인쇄된 것을 보고 싶다는 것입니다. main 突然结束,可能 arr 中还剩下一些东西还没有打印出来,我就看不到了。所以我需要确保这个goroutine在程序结束之前处理完通道中的所有数据。我认为,这意味着我需要使用 WaitGroup 并使用 Wait() 来确保程序在我的 goroutine 完成需要执行的操作之前不会关闭。 但我不知道在我的 WaitGroup 上调用 Done()의 입장이라면.

기본적으로 프로그램이 끝나기 전에 고루틴을 "일시 중지"하고 남은 내용을 인쇄하는 안전한 방법이 필요합니다. 어떻게 해야 하나요?

게다가 단위 테스트 같은 경우에는 제가 직접 채널에 데이터를 보내고 일정량을 보낸 후 어레이를 보고 싶습니다. 그러나 채널에 데이터를 보내는 코드 바로 뒤의 배열을 확인하면 고루틴이 아직 모든 데이터를 처리할 기회가 없었을 수도 있습니다. 이 경우에는 고루틴이 내가 보낸 모든 데이터를 처리할 때까지 기다렸다가 일시 중지하고 배열을 보여달라고 요청하고 싶습니다. 하지만 고루틴이 언제 처리를 완료했는지 어떻게 알 수 있나요? sleep 잠시 기다렸다가 끝낼 기회를 준 다음 멈춰서 볼 수도 있지만 꽤 어색한 느낌이 듭니다. 이 문제를 해결할 수 있는 모범 사례가 있다고 생각하지만 아직 찾지 못했습니다.

제가 생각한 몇 가지 아이디어는 다음과 같습니다. 그 중 전혀 효과가 없었습니다.

  1. 무한대로for 循环之外调用 Done(). 내가 아는 한 코드에 액세스할 수 없기 때문에 작동하지 않습니다.

  2. 시간 초과case中调用Done(). 시간 초과 후에는 더 많은 데이터가 전송될 수 있고 내 고루틴이 계속 듣기를 원하기 때문에 이는 작동하지 않습니다.


정답


채널이 닫힐 때 돌아오도록 리스너를 수정하세요. 돌아올 때 wg.Done()을 호출하세요:

으아악

전송이 완료된 후 채널을 닫도록 기본을 수정하세요. 메인에서 돌아오기 전에 고루틴이 완료될 때까지 기다리세요.

으아악

위 내용은 무한 루핑 고루틴을 종료하는 안전한 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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