2015-01-16 1 views
2

JavaScript 및 노드에 대해 배우고 있습니다. 비동기식 작업 방법을 이해합니다. 왜 속도가 빨라지는지 알 수 있습니다.비 차단 코드에 비해 코드를 차단할 때의 이점은 무엇입니까?

다른 언어 (예 : Ruby 및 Java?)가 차단되도록 설계되었습니다. 왜?

오랜 시간이 걸리는 상황을 처리하기 위해 스레드를 사용할 수 있다는 모호한 생각이 있습니다. 비동기 적으로 일을하는 것보다 장점과 단점은 무엇입니까?

답변

2

블로킹 또는 동기 코드는 작성하기 쉽고 기본 단일 스레드 동작입니다. 각 작업이 다음 작업에 의존 할 때 코드를 차단하는 것이 좋습니다. 멀티 프로세서와 멀티 스레딩 이전에는 역사적으로 유일한 대안이었습니다.

하나 이상의 작업을 병렬로 수행 할 수있는 경우 성능을 향상시키기 위해 비 블로킹, 비동기, 멀티 스레드 프로그래밍이 작성되었습니다. 이렇게하면 성능은 향상되지만 복잡성이 추가되는 대신 코드 유지 관리가 더 어려워집니다.

0

자바 스크립트가 거의 다중 코어에 대한 액세스를 허용하지 않는다는 점에 유의해야합니다. 따라서 (일반적으로) 비 차단 코드의 속도 향상을 볼 수 없습니다. 이것은 다른 언어로 된 비 차단 코드의 주요 이점 중 하나입니다. 자바 스크립트에서 비동기 코드는 일반적으로 이벤트를 처리하는 데 사용됩니다 (예 : 사용자 입력 또는 파일 다운로드). 모든 것을 중단하고 이벤트를 기다리는 데는 어느 정도 시간이 걸릴 수 있습니다. 비동기 코드의 주요 단점은 코드 복잡성입니다. 비동기 코드를 작성할 때마다 객체가 동시에 엉망이되는 두 스레드를 조심해야합니다.

0

또한 RingoJS 또는 초기 노드 경쟁 업체와 같은 JavaScript 런타임 환경을 차단합니다. 블록 실행 코드는 장시간 실행되고 다른 부분으로 나눌 수없는 경우 장점이 있습니다. 비 차단 IO를 기본 스케줄링 간격으로 사용할 수 없다면 차단이 더 나은 해결책 일 수 있습니다.

다음 시나리오에 대해 생각해보십시오. 들어오는 요청의 콘텐츠가 KB가 아닌 수백 메가 바이트입니다. 그리고 코드는 한 번에 모든 들어오는 바이트를 읽습니다. 이벤트 루프에서 이러한 요청을 구문 분석하면 처리 대기 상태 인 대기열의 다른 모든 요청이 차단됩니다. 스레드를 CPU에서 끌어 올 수 있고 다른 스레드가 큰 입력에서 계속 작업을 수행하지만 둘 다 병렬로 활성화되기 때문에 런타임을 차단하면이 작업을보다 쉽게 ​​수행 할 수 있습니다.

블로킹 환경의 실제 문제는 공유 상태입니다. 많은 스레드가 동일한 변수에 액세스 할 수 있으면 동기화가 필요하며 이로 인해 많은 리소스가 낭비됩니다. 비 차단 환경에서 이벤트 루프를 차단하는 것과 같습니다. 그냥하지 마세요.

개인적으로 차단 코드는 한 줄의 실행을 따르고 콜백 또는 선물이 없기 때문에 읽고 이해하기가 쉽습니다. 그러나 그것은 당신이 풀고 자하는 문제에 달려 있습니다. 양측은 다양한 시나리오에서 장단점을 가지고 있습니다.

관련 문제