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


108

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

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

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


8
실제로 현재 R3 구현에는 이에 대한 해결책이 없다고 생각하므로 "대기"에 "/ only"개선을 추가했습니다. "대기"에 제공된 포트에서만 기다립니다. , 따라서 재귀 호출을 피하십시오. 내 풀 리퀘스트 : github.com/rebol/rebol/pull/177
Shixin Zeng

1
호기심 때문에 왜 동기식이 필요합니까?
toadzky

1
동기 포트로 코딩하는 것이 훨씬 더 쉬운 상황이 많이 있습니다. 버튼을 클릭하여 이메일을 보내고 성공 또는 실패를보고한다고 가정합니다. 다른 작업을 수행하기 전에 완료 될 때까지 기다리는 것이 훨씬 쉽습니다.
Shixin Zeng 2015 년

1
Rebol을 꼭 사용해야합니까?
Rivenfall 2015 년

1
예. 이것은 일반적으로 동기식 통신보다 Rebol 3에 대한 질문입니다.
Shixin Zeng

답변:


1

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

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


0

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


0

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

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

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


-1

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

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

1
이것은 일반적으로 동기식 통신보다 Rebol 3에 대한 질문입니다.
Shixin Zeng
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.