문제

"메시지 전달"에 대한 두 가지 방법을 발견했습니다. 하나는 Erlang 사용을 보았고 다른 하나는 Stackless Python에서 나온 것입니다. 내가 여기서 이해하는 것에서 차이점이 있습니다

Erlang Style- 메시지는 수신 프로세스의 사서함으로 전송되고 대기됩니다. 거기에서 그들은 FIFO 기준으로 제거됩니다. 첫 번째 프로세스가 메시지를 보내면 무료로 계속 될 수 있습니다.

파이썬 스타일 - 프로세스 B로 보내기 위해 대기열을 처리합니다. B는 현재 다른 작업을 수행하고 있으므로 B는 수신 할 준비가 될 때까지 A가 얼어 붙습니다. B가 읽기 채널을 열면 A는 데이터를 보냅니다.

이제 Erlang 방법의 장점은 프로세스가 차단되지 않았다는 것을 알 수 있습니다. B가받을 수 없다면 A는 여전히 계속 될 수 있습니다. 그러나 내가 쓴 일부 프로그램에서는 Erlang 메시지 상자가 메시지의 유입이 유출보다 크기 때문에 수백 (또는 수천 개의) 메시지가 가득 할 수 있음을 알았습니다.

이제 저는 프레임 워크/언어로 큰 프로그램을 작성하지 않았으므로 귀하의 경험이 이것에 대한 경험이 궁금합니다.

예, 나는 이것이 추상적이라는 것을 알고 있지만, 나는 또한 다소 추상적 인 답을 찾고 있습니다.

도움이 되었습니까?

해결책

Erlang 프로그래밍에 대한 나의 경험은 높은 메시징 속도 (즉, 소비자보다 더 빠른 생산자)를 기대할 때 자신의 흐름 제어를 추가한다는 것입니다. 간단한 시나리오

  • 소비자는 : 메시지를 보내고 ACK를 기다린 다음 반복합니다.
  • 생산자는 : 메시지를 기다리고 메시지를 받고 처리 할 때 ACK를 보내고 반복합니다.

또한 생산자는 소비자가 와서 다음 사용 가능한 메시지를 잡을 때까지 기다립니다.

이러한 접근 방식 및 기타 유량 제어는 기능 뒤에 숨겨 질 수 있으며, 첫 번째는 대부분 이미 사용할 수 있습니다. gen_server:call/2,3 A에 대해 gen_server OTP 행동 과정.

대기 시간이 높을 때 컴퓨터 간의 메시지를 할 때 동기화를 피하고 싶을 수도 있기 때문에 Erlang에서와 같이 비동기 메시징을 더 나은 접근 방식으로보고 있습니다. 그런 다음 흐름 제어를 구현하는 영리한 방법을 구성 할 수 있습니다. 생산자가 보낸 모든 N 메시지에 대해 소비자로부터 ACK를 요구하거나, 지금이 하나의 메시지를 받았을 때 나에게 핑 타임을 계산하기 위해 특별한 "특별한"메시지를 보냈습니다.

다른 팁

광범위하게 말하면, 이것은 무한한 대기열 대 경계 대기열입니다. 스택리스 채널은 0 크기의 큐의 특별한 경우로 간주 될 수 있습니다.

경계 대기열은 교착 상태에 처한 경향이 있습니다. 전체 대기열로 서로에게 메시지를 보내려고하는 두 개의 스레드/프로세스.

무한한 대기열은 더 미묘한 고장 을가집니다. 대규모 사서함은 언급했듯이 대기 시간 요구 사항을 충족하지 않습니다. 충분히 멀리 가면 결국 넘치게 될 것입니다. 무한 메모리와 같은 것은 없으므로 실제로 가득 차있을 때 프로세스를 중단시키는 막대한 한계가있는 경계 대기열 일뿐입니다.

어느 것이 가장 좋습니까? 말하기 어렵습니다. 여기에는 쉬운 답변이 없습니다.

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