[asynchronous] 포트를 동 기적으로 읽고 쓸 때 재귀를 피합니까?

Rebol 3의 모든 포트 작업은 비동기식입니다. 동기식 통신을 할 수있는 유일한 방법은wait 입니다.

그러나이 경우 대기 호출의 문제점은 열려있는 모든 포트에 대한 이벤트를 확인한다는 것입니다 (대기하도록 전달 된 포트 블록에 있지 않더라도). 그런 다음 응답하는 이벤트 처리기를 호출하지만 해당 이벤트 처리기 중 하나에서 읽기 / 쓰기를 수행 할 수 있습니다. 그러면 “wait”에 대한 재귀 호출이 발생할 수 있습니다.

이 문제를 어떻게 해결합니까?



답변

비동기 항목에서 모든 메시지를 수신하여 FIFO (선입 선출)로 처리하는 일종의 “버퍼”기능을 생성하지 않는 이유는 무엇입니까?

이렇게하면 포트의 Assync 특성을 유지하고 동기화 모드에서 처리 할 수 ​​있습니다.


답변

비동기 이벤트 만 있고 동기 응답이 필요한 경우 타이머를 시작하거나 시간 초과를 위해 절전 모드를 시작하고 핸들러 또는 필수 목표가 충족되면 true라고 말하고 그렇지 않으면 false라고 말하고 이벤트가 취소 / 재설정되는지 확인합니다. 중요하다면 동일합니다.


답변

두 가지 디자인 문제가 있다고 생각합니다 (아마도 도구 / 솔루션에 내재되어있을 수 있습니다).

  1. Wait너무 많이하고 있습니다- it will check events for all open ports. 사운드 환경에서 대기는 필요한 경우에만 구현해야합니다. 장치 별, 포트 별, 소켓 별 … 공유 리소스 간의 불필요한 상호 종속성 생성은 잘 끝날 수 없습니다. 특히 공유 리소스 (상호 종속성 없이도) 많은 문제를 일으킬 수 있습니다.

  2. 이벤트 핸들러 가 너무 많은 일을 수 있습니다. 이벤트 핸들러는 가능한 한 짧아야하며 이벤트 만 처리해야합니다. 더 많은 작업을 수행하는 경우 처리기가 너무 많은 작업을 수행하고있는 것입니다. 특히 다른 공유 리소스와 관련된 경우입니다. 많은 상황에서 핸들러는 그렇지 않으면 손실 될 데이터 만 저장합니다. 비동기 작업은 더 복잡한 작업을 수행합니다.


답변

자물쇠 만 사용할 수 있습니다. Cummunication1은 변수를 사용하여 전역 잠금 상태를 설정할 수 있습니다 (스레드에 안전한지 확인). locked = true. 그런 다음 Communication2는 잠금 해제 될 때까지 기다릴 수 있습니다.

loop do
    sleep 10ms
    break if not locked
end
locked = true
handle_communication()


답변