2014-12-30 4 views
1

Go에는 node.js의 "이미 터"와 동일한 기능이 있습니까?Go의 채널 및 node.js의 이미 터?

나는 스스로를 가르치고있다. 내가 쓴 node.js 라이브러리로 포팅 해보자. 노드 버전에서 라이브러리는 어떤 일이 발생하면 이벤트를 내 보냅니다 (예 : UDP 포트 1234에서 수신 대기하고 "ABC"가 수신되면 "abcreceived"가 생성되므로 호출 코드가 필요에 따라 응답 할 수 있습니다 (예 : "DEF"다시 전송).

Go에서 채널을 보았지만 (아직 읽는 중입니다.) 아직이 언어를 처음 사용하기 때문에 사용할 수있는 방법 (또는 그 방법은 무엇인지)을 모르겠습니다. 내 라이브러리를 사용하는 어떤 코드와 통신합니다.

을 나는 또한 https://github.com/chuckpreslar/emission을 볼 수 있지만,이 받아 들일 경우, 또는 확실하지 오전 한 일을 일의 더 나은 ("모범 사례") 방법.

+0

약간 넓습니다. 채널 사용 방법을 묻고 있습니까?채널에 대한 기본적인 지식이 있다면 소비자가 채널을 참조 할 수 있도록 허용하면됩니다. 아마도'yourpackage.EventChan()'메쏘드를 통해 가능할 것입니다. –

+0

@SimonWhitehead : 채널이 갈 길인지 또는 node.js 'EventEmitter와 동등한 것이 있는지 물어볼 것입니다. 채널에서 읽는 중이지만 내 라이브러리에서 (예 : EventChan) 새 채널을 만들어 EventEmitter와 같이 사용하도록 제안합니다 (예 : 채널에 채널이 "abcreveived"되어 있다면 무엇인가할까요?). 언급했듯이 나는 아직도 Go를 배우고 있으므로 일부 개념에 대해 머리를 감싸고있다. – Grayda

+1

@Grayda이 답변을 읽는 것이 좋습니다. http://bit.ly/1He8sQU – wonsky

답변

0

이 있다면 그래서 다른 사람들의 Go 코드와 링크를 읽음으로써 내 질문에 대한 의견에서 나는 채널이 갈 길이라고 생각한다.

내 라이브러리 코드에서

(반 의사 코드) :

// Make a new channel called "Events" 
var Events = make(chan 

func doSomething() { 
    // ... 
    Events <-"abcreceived" // Add "abcreceived" to the Events channel 
} 

그리고 내 라이브러리를 사용하는 코드 : (

evt := <-mylib.Events 

switch evt { 
    case "abcreceived": 
     sendBackDEF() 
     break 
    // ... 
} 

나는 여전히 Node.js를 'EventEmitter를 선호 당신 때문에 데이터를 쉽게 다시 전송할 수는 있지만) 단순한 경우에는 충분합니다.

+0

채널을 통해 전달 된 값은 한 번만 소비 될 수 있으므로 큰 대체물은 아닙니다. 잘 작성된 Go 솔루션은 잘 작성된 노드 솔루션처럼 보이지 않습니다. 노드는 콜백 또는 이벤트를 사용하여 차단을 방지하고 Go에서는 이동 루틴을 사용하여 동일한 작업을 수행 할 수 있습니다. – jmaloney

+0

@jmaloney 모든 알림 (예 : 한 번 이상 ABC 수신)이 채널에서 새 항목을 사용하도록 푸시하므로 이벤트 알림을 위해 필요한 것이 전부입니다. 주변에 머물기 위해 뭔가가 필요한 경우 (예 : "현재 ABC를 받고 있습니까?"), 채널이 갈 길이없는 것 같습니다 (해당 정보가 들어있는 부울을 노출하게됩니다.) – Grayda

0

이동 및 Node.js는 매우 다릅니다. Node.js는 콜백을 통해서만 동시성을 지원합니다. 그들을 꾸미는 데는 여러 가지 방법이있을 수 있지만 근본적으로 콜백입니다.

Node.js에는 이없고 병렬 처리가 있습니다. Node.js는 단일 스레드 런타임을가집니다. Node.js async이 '병렬'실행을 달성하는 데 사용되는 경우, Go에서 사용되는 의미에서는 병렬이 아니지만 동시에 실행됩니다.

Concurrency is not parallelism Go 세계.

Go에는 Oxford의 Tony Hoare가 생각한 수학적 기반 인 CSP (Sequicating Processs)를 기반으로 명시 적 동시성이 있습니다. 런타임은 goroutine이라고하는 협력 프로세스를 사용 가능한 CPU 코어로 시간 분할하여 인터리빙합니다. 각 goroutine 내에서 코드는 단일 스레드이므로 쓰기가 쉽습니다. 단순한 경우 goroutines 간에는 데이터가 공유되지 않습니다. 대신 메시지는 채널을 따라 전달됩니다. 이런 식으로 콜백이 필요 없습니다.

goroutines가 I/O를 기다리는 동안 차단 될 때, 차단 해제되기 전까지 CPU 시간을 사용하지 않기 때문에 괜찮습니다. 그들의 메모리 사용량은 미미하며 매우 많은 수의 메모리를 가질 수 있습니다. 따라서 콜백은 I/O 작업에도 필요하지 않습니다.

Go 및 Node.js의 실행 모델이 다를 수 있으므로 하나에서 다른 코드로 포트 코드를 시도하면 매우 어색한 솔루션이 될 가능성이 큽니다. 원래 요구 사항에서 시작하여 처음부터 구현하는 것이 좋습니다.

함수 인수를 사용하여 Go 동시성 모델을 왜곡하여 콜백처럼 작동하는 것이 가능할 수 있습니다. 이는 관용적이지 않고 CSP가주는 이점을 잃어 버리기 때문에 좋지 않은 아이디어입니다.

+0

감사합니다. 교훈! 나는 그런 것들에 대한 나의 더 깊은 지식을 솔질 할 필요가 있다고 생각한다. 내 라이브러리는 주로 네트워크 기반이므로 이식은 그리 좋지 않습니다. 어려움의 대부분은 제가 코드로 배우는 것입니다 (6 개월 전이 아니라 노드를 마스터 한 것입니다!). 나머지는 간단한 스위치와 if 문으로 간단한 기능입니다. – Grayda