저는 다트에 다양한 자바 프로그램을 이식하고 결과를 비교 및 분석함으로써 독일 회사에 대해 다트를 평가할 것입니다. 브라우저에서 Dart가 손을 놓습니다. 서버 소프트웨어의 성능은 심각한 문제인 것으로 보였으 나 (this question of me 참조) 대부분 해결되지 않았습니다.비동기식 다트 호출을 동기식으로 만드는 방법은 무엇입니까?
이제는 심각한 문제가 전혀 예상되지 않지만 적어도 하나는있는 "간단한"명령 줄 도구를 이식하는 영역에 있습니다. 일부 도구는 HTTP 요청을 통해 일부 데이터를 수집하며 독립 실행 형 다트 가상 시스템은 비동기 방식으로 만 지원합니다. 대부분 동기식 소프트웨어에서 비동기 호출을 사용하는 것이 가능하지는 않다.
사용할 수있는 동기식 소프트웨어를 비동기식으로 재구성 할 수 있음을 이해합니다. 하지만 이렇게하면 잘 설계된 소프트웨어가 덜 읽기 쉽고 디버깅 및 유지 관리가 어렵게됩니다. 일부 소프트웨어 조각의 경우 이는 의미가 없습니다. 내 질문 : 동기식으로 호출 된 메서드에 비동기 호출을 포함시키는 방법이 있습니까?
메인 스레드 내에서만 사용할 수있는 시스템 호출을 제공하는 것이 어렵지 않을 것이라고 생각합니다. 메인 스레드 내에서 사용할 수 있습니다.이 스레드는 메인 스레드를 먼저 종료하지 않고 대기열에있는 비동기 함수 호출의 전체 목록으로 실행을 전송합니다) 그리고 실행 된 마지막 하나가 돌아 오자 마자 메인 스레드가 계속됩니다. 다음과 같을 수
뭔가 :
var synchFunction() {
var result;
asyncFunction().then(() { result = ...; });
resync(); // the system call to move to and wait out all async execution
return result;
}
뿐만 아니라 LIB API를 단순화하는 것이 이러한 방법을 가졌어요. 재 동기화 호출이 작업을 수행하기 때문에 대부분의 "동기화"호출을 제거 할 수 있습니다. 나는 아직도 그것이 어떻게 든 존재한다고 생각하고 그것을 놓쳤다는 것은 논리적 인 생각 인 것 같다. 아니면 작동하지 않는 심각한 이유가 있습니까?
lm
(아래 참조)에서받은 응답을 이틀 동안 생각한 후에 비동기식 다트 호출을 동기식으로 캡슐화하는 것이 왜 가능하지 않아야하는지 아직 이해할 수 없습니다. 그것은 항상 "정상적인"동기식 프로그래밍 세계에서 이루어집니다. 대개 비동기 루틴에서 "완료"를 얻거나 시간 초과 후 계속 실패 할 경우 재 동기화를 기다릴 수 있습니다. 그와
염두에 내 첫 번째 제안은 그런 식으로 강화 될 수있다 :
var synchFunction() {
var result;
asyncFunction()
.then(() { result = ...; })
.whenComplete(() { continueResync() }); // the "Done" message
resync(timeout); // waiting with a timeout as maximum limit
// Either we arrive here with the [result] filled in or a with a [TimeoutException].
return result;
}
가 resync()
가 일반적으로 분리의 main
방법을 종료 한 후에 일어날 그 같은 일, 그것은 대기중인 비동기 기능을 실행 시작 (또는 이벤트를 실행 가능하게 만들 때까지 대기). continueResync()
호출을 만나면이 비동기 실행을 중지하는 플래그가 설정되고 resync()
이 주 스레드로 돌아갑니다. 주어진 timeout
기간 동안 continueResync()
호출이 없으면 비동기 실행을 중단하고 resync()
을 TimeoutException
으로 남겨 둡니다.
클라이언트 소프트웨어 및 서버 소프트웨어가 아닌 직선 동기 프로그래밍의 이점을 갖는 일부 소프트웨어 그룹의 경우 이러한 기능은 비동기 전용 라이브러리를 처리해야하는 프로그래머에게 많은 문제를 해결합니다.
나는 또한 아래의 lm
의 논증에서 주된 논점에 대한 해결책을 찾았다 고 생각한다.따라서 제 질문은 여전히 제가 제안한이 "강화 된"솔루션과 관련되어 있습니다 : Dart에서이를 구현하는 것이 불가능한 것은 무엇입니까?
하지만 멀티 스레드로 다트를 필요 어쩌면 다트 런타임 철학의 주요 재 구조를 필요로하며, 다음과 같습니다
완성도를 들어
saveClicked
의 비동기 버전은 다음과 같습니다 . 그들이 Dart를 멀티 스레드로 만들었다면 Dart 프로그래머는 모두 스레드 동기화 문제를 처리해야합니다. 그러면 기존의 많은 코드를 깨는 것뿐만 아니라 모든 사람의 삶을 상당히 복잡하게 만들 것입니다. – bikeman868