문제

Scala에서 행위자의 메일박스에 대한 최대 크기를 설정할 수 있나요?

생산자-소비자 문제를 생각해 보세요.스레드를 사용하면 버퍼가 가득 차면 생산자를 차단할 수 있습니다.나는 Scala로 작성된 몇 가지 생산자-소비자 예제를 보았으며 모두 "버퍼"로 사용되는 메일박스와 함께 액터를 사용합니다.소비자가 준비될 때까지 생산자가 기다리도록 사서함 크기를 설정할 수 있습니까?통제할 수 없는 사서함 증가를 방지할 수 있는 다른 솔루션이 있습니까?

도움이 되었습니까?

해결책

생산자와 소비자 사이의 버퍼 역할을 하는 행위자를 만들 수 있습니다.버퍼는 루프 데이터에 대한 메일함을 체크아웃합니다.버퍼링된 제품 수가 너무 많으면 "오버로드" 메시지를 생산자에게 다시 보냅니다.모든 것이 정상으로 돌아오면 "clear" 메시지를 보냅니다.메시지가 너무 많으면 들어오는 메시지(또는 가장 오래된 메시지)를 삭제합니다.

소비자는 버퍼로부터 적극적으로 제품을 요청하고, 버퍼는 다시 하나의 제품을 돌려보냅니다.버퍼가 비어 있으면 소비자는 입력을 계속 기다립니다.

생산자는 버퍼 행위자에게 제품을 보냅니다."과부하" 메시지를 받으면 생산을 중단하거나 제품이 떨어질 수 있다는 사실을 알고 생산을 계속할 수 있습니다.

물론 이 논리는 생산자 또는 소비자 자체에 직접 구현될 수 있지만 별도의 버퍼를 사용하면 여러 생산자 및/또는 소비자를 더 쉽게 도입할 수 있습니다.

다른 팁

그만큼 Actor.mailboxSize 메소드는 배우의 사서함에서 보류중인 메시지 수를 반환합니다.

이것은 생산자를 다양한 방식으로 조절하는 데 사용할 수 있습니다.

예를 들어, 한 가지 가능성이있을 수 있습니다.

생산자는 소비자가 있는지 확인합니다 mailboxSize 임계 값보다 큽니다. 그렇다면 a SpecialMessage 소비자에게, 세마포어에 차단됩니다. 소비자가 이것을받을 때 SpecialMessage 세마포어를 방출합니다. 프로듀서는 이제 비즈니스를 즐겁게 계속할 수 있습니다.

이것은 폴란드 메시지뿐만 아니라 여론 조사를 피할 수 있습니다.

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