>백엔드 개발 >Golang >golang에서 ID를 기반으로 채널 작업을 취소하는 방법

golang에서 ID를 기반으로 채널 작업을 취소하는 방법

PHPz
PHPz앞으로
2024-02-08 23:42:11752검색

golang에서 ID를 기반으로 채널 작업을 취소하는 방법

golang에서는 채널 작업 취소가 일반적인 요구 사항입니다. 동시 작업을 처리할 때 작업 ID를 기반으로 실행 중인 작업을 취소해야 하는 경우가 있습니다. 그렇다면 golang에서 이 기능을 어떻게 구현할까요? 아래에서는 간단하고 효과적인 방법을 소개하겠습니다. 먼저 작업 ID를 저장할 버퍼링된 채널을 만들어야 합니다. 그런 다음 select 문을 사용하여 채널의 읽기 작업을 수신하고 작업을 취소해야 할 때 작업 ID를 채널로 보낼 수 있습니다. 그런 다음 작업 실행 기능에서 채널이 닫혔는지 여부를 판단하여 작업을 취소해야 하는지 여부를 결정할 수 있습니다. 채널이 닫히면 작업이 취소되고 적절한 위치에서 작업 실행을 종료할 수 있습니다. 이런 식으로 golang의 ID를 기반으로 채널 작업을 쉽게 취소할 수 있습니다. 위 내용은 PHP 에디터 Xinyi님이 소개한 방법인데, 모든 분들께 도움이 되었으면 좋겠습니다!

질문 내용

그래서 저한테 하나 있어요post 端点,它创建一个作业并将它们添加到一个 chan 中。 workerjobschan = make(chan job, maxqueuesize)

채널에서 제가 일하는 방식은 다음과 같습니다(main.go):

으아악

지도에 취소 기능을 저장합니다: canceljobfuncs = make(map[int]context.cancelfunc).

직무는 다음과 같습니다.

으아악

다음과 같이 (http 처리기에서) 컨텍스트를 취소합니다.

으아악

하지만 작업은 계속 실행됩니다. 나는 많은 것을 시도했지만 제대로 작동하지 않는 것 같습니다.

해결 방법

다음은 명확한 요점을 설명하는 방법입니다. 코드가 ctx.done()를 확인하지 않으면 코드가 취소되었음을 알 수 있는 방법이 없습니다.
(그런데 이것은 @jimb이 귀하의 질문에 대한 의견에 쓴 내용의 또 다른 의역입니다.)

그래서 .execute(...) 메소드의 코드가 이 블록을 실행하기 시작하면:

으아악

블록 끝에 도달합니다(7초). 취소 시 중지하라는 지시가 없습니다.

"sleep" 명령 중에 함수가 취소를 감지할 수 있도록 하려면 코드를 변경해야 합니다.

예제를 사용하여 이 작업을 수행하는 방법의 예는 다음과 같습니다.

으아악

https://www.php.cn/link/3bc31a430954d8326605fc690ed22f4d

실제 코드에는 time.sleep() 指令,而是 processsearch(...)doquery(...) 또는 ...

이 없는 것 같습니다.

실행 중에 이러한 함수를 취소할 수 있어야 하는 경우 취소 컨텍스트를 함수에 전달하고 어떤 방식으로든 취소를 확인하도록 해야 합니다.

컨텍스트를 전달하는 한 가지 방법은 해당 함수의 매개변수에 컨텍스트를 추가하는 것입니다.

으아악

그러나 기존 코드에 따라 일부 매개변수에는 취소할 수 있는 메서드가 이미 내장되어 있을 수도 있습니다.
예:

으아악

위 내용은 golang에서 ID를 기반으로 채널 작업을 취소하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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