문제

나는 최근에 Google의 프로그래밍 언어에 대해 배웠습니다. 나는 동시성에 대한 지원에 흥미를 느꼈으 며, 그것에 대해 더 많이 배우기 시작했습니다. 그러나 나는 GO가 동시성의 특정 기능을 어떻게 구현했는지 살펴 보았고 지금 까지이 기능이 전혀 존재한다는 증거를 보지 못했습니다.

가상의 상황은 다음과 같습니다. 특정 입력의 FOO 값을 결정하는 기능을 프로그래밍한다고 가정 해 봅시다. 주어진 입력의 경우, FOO 값은 도메인 A 또는 도메인 B (둘 다가 아님)에서 발견됩니다. 이 도메인에서 검색 기술은 상당히 다르지만 성공적인 검색이 빠르게 돌아 오는 경향이있는 속성을 공유하지만 검색에 실패한 검색은 전체 데이터 세트를 거쳐 완화되어야합니다.

이제 동시성을 사용하는 다른 언어 (예 : 실크) asearch 함수와 BSEARCH 함수가 스폰되도록 함수 foosearch를 프로그래밍 할 수 있습니다. 이러한 기능은 동시에 그리고 언제든지 실행됩니다 어느 하나 그들 중 답변을 내놓았다. 그 대답은 호출 함수 foosearch 에보 고 될 것이며, 이는 반환되지 않은 스폰 된 기능을 종료 할 것이다.

그러나 Go의 Goroutines를 사용하면 두 개의 루틴을 채널과 만 연결할 수있는 것처럼 보입니다. 따라서 ASEARCH 또는 BSEARCH가 보낼 수있는 채널을 설정할 수 없었습니다. 그것. 또한 차단하지 않고 채널에서 읽을 수없는 것처럼 보입니다. 따라서 Fookearch를 시작할 수 없었기 때문에 Asearch 및 BSearch를 시작하고 둘 다에서 채널을 설정 한 다음 루프 검사에서 실행하여 한 또는 다른 사람이 생성되었는지 확인하십시오. 답변.

Go의 동시성 한계에 대한 나의 이해가 맞습니까? 주어진 결과를 달성하는 또 다른 방법이 있습니까?

도움이 되었습니까?

해결책

아니요, GO의 한계에 대한 귀하의 이해가 정확하다고 생각하지 않습니다.

우선, 채널이 두 루틴간에 의사 소통하는 데 제한을 제한하는 것은 내가 본 것이 없습니다. 동일한 채널을 ASEARCH 및 BSEARCH에 모두 전달한 다음 해당 채널에서 결과를 보낼 수 있습니다.

대신 두 개의 채널을 사용하고 결과를 얻을 때까지 기다리면 select 성명. 로부터 튜토리얼로 이동하십시오, 요청을 보내는 데 사용되는 채널에서 선택한 예와 서버가 종료하도록 신호를 보내는 데 사용되었습니다.

21    func server(op binOp, service chan *request, quit chan bool) {
22        for {
23            select {
24            case req := <-service:
25                go run(op, req);  // don't wait for it
26            case <-quit:
27                return;
28            }
29        }
30    }

또한 채널에서 일반적으로 블록으로 수신되지만 비 블로킹 수신 채널에서.

양식의 할당 또는 초기화에 수신 표현이 사용되는 경우

x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch

수신 작업이 차단되지 않습니다. 작업이 진행될 수 있으면 부울 변수 OK가 True로 설정되고 x에 저장된 값; 그렇지 않으면 OK가 False로 설정되고 X는 해당 유형의 0 값으로 설정됩니다 (§0 값).

따라서 차단하지 않고 여러 고어 라인의 결과를 기다리는 방법에는 여러 가지가 있습니다. 나는 여러 채널을 다용도로 사용하여 갈 것이라고 생각합니다 select, 이렇게하면 해당 정보를 보내거나 다른 형태의 대역 외의 커뮤니케이션을 수행하는 값으로 해당 정보를 패키지하지 않고도 결과를 반환 한 루틴을 쉽게 알 수 있습니다.

다른 팁

당신은 사용할 수 있습니다 select 여러 채널에서 수신 할 키워드.

값은 다른 것보다 더 일찍 결과를 얻은 채널에서 가져옵니다.

var c1, c2 chan int;
var result int;

select {
case result = <-c1:
    print("received ", result, " from c1\n");
case result = <-c2:
    print("received ", result, " from c2\n");
}

참조

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top