>  기사  >  백엔드 개발  >  Golang은 컨텍스트의 모든 값을 복사합니다.

Golang은 컨텍스트의 모든 값을 복사합니다.

WBOY
WBOY앞으로
2024-02-05 23:39:07864검색

Golang은 컨텍스트의 모든 값을 복사합니다.

질문 내용

저는 비동기 작업을 제공하는 HTTP 서버 애플리케이션을 가지고 있습니다.

으아악

사용자는 장기 실행 비동기 작업을 요청할 수 있으며 애플리케이션은 고루틴을 만든 후 즉시 요청에 응답합니다.

요청 ID, 인증된 토큰, 사용자 정보를 요청의 context.Context 中。而且,我想把它放在 goroutine 下。但是,对请求 context 使用相同的 context에 넣었는데, 응답 후 예기치 않은 취소가 발생했는데, 이는 의도한 동작이 아닙니다.

고루틴의 응답을 가져온 후 죽지 않고 모든 값을 포함하는 새로운 context,独立于父请求 context?或者,还有其他方法可以保证 context을 생성하는 방법은 무엇입니까?

보너스 질문:

Job1 ~ Job3 应该被序列化,即 Job2 应该等待 Job1Job3 等待 Job2。并且,Job1AJob1B 可以同时运行。如果我想传播给定 context 취소, 경로(?) 취소는 어떻게 하나요? 모든 기능에 대해 select 문을 확인해야 합니까?

무의미한 작업을 수행하지 않고 취소 및 조기 종료 개념을 전파하는 것을 이해합니다 context. 그러나 코드에서 이를 처리하는 방법을 찾지 못했습니다. 누군가가 이해를 도울 수 있다면 기쁠 것입니다.


정답


컨텍스트의 값을 찾을 수 없습니다. 맵으로 저장되지 않고 컨텍스트 레이어로 저장되며, 각 레벨은 잠재적으로 값이 저장되는 방식에 대한 다른 구현을 제공합니다.

그러나 어떤 값을 전파해야 하는지 알고 있다면 해당 값을 쿼리하고 해당 값으로 새 컨텍스트를 만들 수 있습니다.

즉, 다른 컨텍스트의 값을 사용하는 새로운 컨텍스트 유형을 구현할 수 있습니다.

으아악

기존 값 컨텍스트를 사용하고 다른 모든 항목에는 새 컨텍스트를 사용합니다.

그런 다음 새 컨텍스트를 사용하여 요청 처리를 계속하려면 새 고루틴을 시작하세요.

여러 개의 동시 작업을 생성하려면 다음 고루틴에서 이를 수행할 수 있습니다.

으아악

이렇게 하면 컨텍스트가 취소되면 두 작업 모두 취소 알림을 받게 됩니다. job1과 job2의 취소를 별도로 제어하려면:

으아악

연속적인 작업의 경우(즉, job3이 job1 후에 종료됨) 하나의 작업처럼 보이도록 결합하기만 하면 됩니다.

컨텍스트가 취소되었는지 확인하려면 컨텍스트의 Done 通道上执行 select에서 이를 수행하거나 다음을 확인하면 됩니다.

으아악

위 내용은 Golang은 컨텍스트의 모든 값을 복사합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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