2014-11-11 3 views
5

현재 Java 배경에서 오는 C#을 배우고 있습니다. 젖은 채로 나는 간단한 SMTP 메일 응용 프로그램을 만들기로 결정했습니다. C#은 동기 소켓과 비동기 소켓을 모두 지원한다는 사실을 매우 빨리 배웠습니다.동기식과 TCP 소켓 연결에서 비동기식의 이점

내가 볼 수 있듯이 동기 소켓과 비동기 소켓을 사용할 때 이점은 없다. 왜냐하면 후자는 차단되지 않으므로 매번 새 스레드를 만들 필요가 없기 때문이다. 하나 또는 다른 것을 사용하는 데 상당한 오버 헤드가없는 것처럼 보입니다.

그럼 내 질문에 동기식 소켓을 사용하는 것이 유리한가요? 아니면 대부분의 경우 비동기식을 사용하는 것이 더 낫습니까?

+1

모두 상황에 따라 다르다. 99 %의 경우 비동기식을 사용하고 1 % 동기식으로 이메일을 보내고 그 코드 블록이 끝났는지 확인하고 싶다. 그 후에 프로그램을 계속 진행하십시오. 또한이 pourpose에 대한 자신의 스레드를 만들면 동기도 사용할 수 있습니다. – Vajura

+0

나는 그것이 사실이라고 추정했다. 하지만 비동기로도 같은 일을 할 수 있다고 생각했습니다. 아니면 내가 틀렸어? –

+2

@MuhammadHijazi 당신 말이 맞아요. 기능적으로, 비동기 또는 동기화 소켓을 사용하는 것 사이에는 ** 아무런 차이가 없습니다 **. – dcastro

답변

6

어느 메커니즘이든 작동합니다. 가장 큰 차이점은 동기는 다른 유용한 일을하는 스레드를 차단하거나 각 연결에 스레드를 할당한다는 의미입니다. 어느 쪽이든, 이것은 아주 잘 확장되지 않습니다. 활성 연결이 거의 없거나 하나만있는 간단한 응용 프로그램의 경우에는 문제가 없을 수 있습니다.

그러나 많은 수의 동시 연결을 처리해야하는 시나리오의 경우 비동기 API 만 적절한 성능을 제공합니다. 또한 대화 형 시나리오 (예 : 사용자 입력 및 출력을 처리해야하는 경우)에서 비동기 방식을 사용자 인터페이스와보다 쉽게 ​​통합 할 수 있습니다. C#에서 asyncawait을 사용하면 특히 그렇습니다.

+0

적절한 구현의 경우 동기식 API는 리스너 소켓에 대해 하나의 스레드를 의미하고 클라이언트 연결마다 * 2 개의 스레드를 의미합니다. –

+0

이것은 응용 프로그램 프로토콜에 따라 다릅니다. 간단한 요청/응답 프로토콜은 수신 및 송신을 동시에 요구하지 않으며 단일 스레드에서 처리 할 수 ​​있습니다. –

+0

모든 것이 완벽 할 때만. "단순한"요청/응답 프로토콜은 타이머를 복구해야하는 상황에서 반 개방 상태를 감지 할 수 없습니다. –

5

비동기 IO는 스레드를 저장합니다. 스레드는 일반적으로 1MB의 스택 메모리를 사용합니다. 동시 처리되지 않은 IO 작업 수가 많아 질 때 비동기 IO를 사용하는 주된 이유입니다. 내 측정에 따르면 OS의 확장 성은 수천 개의 스레드가 될 때까지 중요하지 않습니다.

가장 큰 단점은 같은 수준의 안정성으로 동일한 응용 프로그램을 작동하려면 더 많은 개발 노력이 필요하다는 것입니다. 또한

I have written about this tradeoff at length.는 : Should we switch to use async I/O by default?

항상 IO 비동기 사용을 권장하기 위해 객관적으로 잘못된 조언이다.