Node.js의 비동기 흐름 제어에 대한 간략한 소개
Oct 25, 2017 am 09:27 AM이 글은 주로 Node.js의 비동기 흐름 제어에 대한 간략한 논의를 소개합니다. 편집자는 그것이 꽤 좋다고 생각합니다. 지금부터 공유하고 참고용으로 제공하겠습니다. 에디터를 따라가서 함께 살펴볼까요
서문
함수 콜백에 대한 깊은 경험이 없으면 아직은 내용을 읽기가 조금 어렵습니다. Node.js 특유의 비동기적 특성으로 인해 '콜백 지옥' 문제가 등장했습니다. 이번 글에서는 비동기 흐름 문제를 해결하는 방법을 좀 더 자세히 기록했습니다.
글이 길어질 예정이며, 이번 글은 비동기 스트리밍 모드에 대한 설명입니다. 이 기사에서는 간단한 웹 스파이더 예제를 사용합니다. 해당 기능은 지정된 URL의 웹 콘텐츠를 크롤링하고 이를 프로젝트에 저장하는 것입니다. 기사 끝 부분에서 전체 기사의 소스 코드 데모를 찾을 수 있습니다.
1. 네이티브 JavaScript 모드
이 글은 초보자를 위한 글이 아니기 때문에 대부분의 기본 내용은 생략하겠습니다:
(spider_v1.js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
|
위 코드의 과정은 아마도 다음과 같습니다.
URL을 파일 이름으로 변환
파일 이름이 존재하는지 확인하고, 없으면 직접 반환하고, 그렇지 않으면 다음 단계로 이동하세요.
요청을 보내고 본문을 가져옵니다
쓰기 파일에 본문이 있습니다.
이것은 매우 간단한 스파이더 버전입니다. 위의 콜백이 얼마나 번거로운지 확인하세요. 그런 다음 최적화를 시작합니다.
먼저 if else 메소드를 최적화할 수 있습니다. 말할 필요도 없이 비교 효과는 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
코드를 이렇게 작성하면 레이어가 하나 줄어듭니다. 중첩되지만 숙련된 프로그래머라면 이러한 방식으로 오류를 지나치게 강조한다고 생각할 수도 있습니다. 우리 프로그래밍의 초점은 올바른 데이터를 처리하는 것이어야 합니다. 가독성 측면에서도 그러한 요구 사항이 있습니다.
또 다른 최적화는 함수 분할입니다. 위 코드의 스파이더 함수에서는 다운로드한 파일과 저장된 파일을 분할할 수 있습니다.
(spider_v2.js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
|
위 코드는 기본적으로 네이티브 최적화의 결과이지만 이 스파이더의 기능은 이제 너무 간단하므로 특정 웹페이지의 모든 URL을 크롤링해야 합니다. 직렬 및 병렬 문제가 발생할 수 있습니다.
(spider_v3.js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
|
이전 코드와 비교하여 위 코드에는 두 가지 핵심 기능이 더 있습니다. 첫 번째는 보조 클래스를 통해 특정 본문의 링크를 얻는 것입니다.
1 |
|
내부 구현 더 이상 설명하지 않겠습니다. 또 다른 핵심 코드는 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
위의 작은 코드 조각은 비동기 직렬화를 구현하기 위한 기본 패턴이라고 할 수 있습니다. 이 외에도 중첩 개념도 도입되었으며, 이 속성을 통해 크롤링 수준을 제어할 수 있습니다.
이제 성능을 고려하여 직렬 기능을 완전히 구현했으며 병렬 크롤링 기능을 개발해야 합니다.
(spider_v4.js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
|
이 코드도 매우 간단하고 핵심 내용이 두 개 있습니다. 하나는 동시성을 달성하는 방법입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
위 코드는 동시성을 달성하기 위한 패턴이라고 할 수 있습니다. 이는 루프 순회를 사용하여 달성됩니다. 또 다른 핵심은 동시성이므로 fs.exists를 사용하는 데 문제가 있을 수 있으며 동일한 파일이 반복적으로 다운로드될 수 있다는 것입니다. 여기서 해결 방법은 다음과 같습니다.
Map을 사용하여 특정 URL을 캐시하면 URL은 Used as the key
이제 최대 동시 동시성 수를 제한해야 하는 새로운 요구 사항이 있으므로 여기서 가장 중요하다고 생각하는 개념인 대기열을 소개합니다.
(task-Queue.js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
위 코드는 큐의 구현 코드입니다. 핵심은 태스크가 큐에 추가될 때 나타나는 코드입니다. 이는 작업이 즉시 실행되어야 한다는 의미는 아니지만, next가 즉시 호출된다는 의미입니다.
(spider_v5.js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
|
따라서 동시성 수를 제한하려면 spiderLinks 메서드의 대기열에 작업 순회를 넣기만 하면 됩니다. 이것은 비교적 간단합니다.
지금까지 우리는 기본 JavaScript를 사용하여 직렬 및 동시 기능이 모두 가능하고 동시성 수를 제어할 수도 있는 비교적 완전한 기능을 갖춘 웹 스파이더를 구현했습니다.
2. 비동기 라이브러리 사용
비동기 라이브러리는 매우 인기가 높으며 내부적으로도 콜백을 기반으로 합니다.
(spider_v6.js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
|
위 코드에서는 async의 세 가지 기능만 사용했습니다.
1 2 3 |
|
상대적으로 간단하므로 설명하지 않겠습니다. 비동기 대기열의 코드는 (spider_v7.js)에 있는데, 이는 위의 사용자 정의 대기열과 매우 유사하므로 더 이상 설명하지 않겠습니다.
3.Promise
Promise는 이 프로토콜을 구현하는 많은 라이브러리가 있습니다. 간단히 말해서, 약속이 완료되면 해당 확인 메서드가 호출되고 거부 메서드가 호출됩니다. then 메소드를 구현한 다음 Promise 자체를 반환하여 호출 체인을 형성합니다.
其实Promise的内容有很多,在实际应用中是如何把普通的函数promise化。这方面的内容在这里也不讲了,我自己也不够格
(spider_v8.js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
|
可以看到上边的代码中的函数都是没有callback的,只需要在最后catch就可以了。
在设计api的时候,应该支持两种方式,及支持callback,又支持promise
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
4.Generator
Generator很有意思,他可以让暂停函数和恢复函数,利用thunkify和co这两个库,我们下边的代码实现起来非常酷。
(spider_v9.js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
|
위 내용은 Node.js의 비동기 흐름 제어에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

인기 기사

인기 기사

뜨거운 기사 태그

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법

WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법

간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법

JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축
