콜백에 대해 이야기하기

저자 소개: 안녕하세요 여러분. 저는 ZTE와 Meituan의 전 설계자이자 현재 인터넷 회사의 CTO인 Brother Smart입니다.

qq에 연락하세요: 184480602, 저를 그룹에 추가해 주세요, 함께 배우고, 함께 발전하고, 인터넷의 추운 겨울을 함께 싸워요

나는 나와 같은 대부분의 학생들이 오랫동안 다음과 같은 개념 때문에 고민해 왔다고 믿습니다.

  • 콜백(콜백 함수)이란?
  • 동기/비동기/차단/비차단이란 무엇입니까?

오늘은 이러한 것들에 대해 함께 이야기해 보도록 하겠습니다.

콜백 개념 설명

이는 매우 일반적인 메소드 호출입니다.

일반적으로, method() 호출은 매우 짧은 시간(보통 몇 밀리초)이 소요됩니다. 그러나 method()가 내부적으로 디스크 IO를 포함하거나 method()가 단순히 네트워크 호출(네트워크 IO)인 경우에는 시간이 더 많이 걸릴 수 있습니다. "시간이 많이 걸린다"고 간주되는 데 걸리는 시간은 정의하기가 쉽지 않습니다. 현재의 경우 호출자는 최종 결과를 얻는 데 걸리는 시간을 견딜 수 없다고 이해될 수 있습니다.

메인 스레드는 메서드가 계속해서 클라이언트에 응답하기 전에 결과를 반환할 때까지 기다려야 합니다.

시간이 많이 걸리는 작업을 해결하는 방법은 무엇입니까? "비동기"를 쉽게 생각할 수 있습니다.

여기서 "비동기"는 좁은 "하위 스레드 시작"을 의미합니다. 그러나 위 그림은완전하지 않습니다. 원본 코드의 Method() 결과는 다음과 같습니다.

이때 모순이 있습니다. 메서드가 비동기적으로 실행되더라도 기본 스레드는 메서드의 반환 결과를 얻어야 합니다.

두 가지 옵션을 쉽게 생각할 수 있습니다.

  • main()은 자체적으로 루프를 시작하고 결과가 나올 때까지 메서드에 계속 질문합니다. 괜찮은지, 괜찮은지...
  • 메인 블록과 대기

여기서는 하위 스레드 결과를 얻는 두 가지 방법을 간단히 상상해 보겠습니다. 먼저 구현 방법을 자세히 알아보지 마세요.

그러나 실제로두 메서드는 호출자(기본)에 대해 동일하며시간이 많이 걸리는 작업을 기다려야 합니다. 메소드 결과가 완료될 때까지 결과를 받을 수 없으므로 후속 작업을 나중에 수행할 수 있습니다.

그래서 모순이 발생합니다.

  • 뭔가를 하는 것은 메소드의 결과에 달려있다
  • 그런데 방법이 너무 느리네요
  • 그리고 가능한 한 빨리 뭔가를 하고 돌아가고 싶습니다.

이를 처리하는 더 좋은 방법은 다음과 같습니다.

do Something은 메소드의 결과에 따라 달라지므로 do Something은 메소드와 함께 처리되어야 하므로 do Something을 메소드 내부로 옮겼습니다.

왼쪽 그림은 비동기 쓰레드를 사용하는 것 같은데, 비동기 결과를 얻어야 하기 때문에 블로킹 대기가 발생하고, 비동기 효과가 최대화되지 않습니다!

어떤 일을 메소드로 옮기는 방법은 무엇입니까? 가장 쉬운 방법은 물론 전체 코드를 메서드에 직접 "절단"하는 것입니다. 그러나 어떤 일을 하는 것은 바뀔 수 있고 불확실하므로 메서드에 하드 코딩하지 않는 것이 가장 좋습니다. method()가 사용자 정의 작업을 수행하는 데 도움이 되도록 method()는 다른 입력 매개변수를 제공해야 합니다.

callback()은 구체적이며 호출자만이 어떤 종류의 처리를 수행할지 알고 있으므로 호출자가 특정 콜백 처리를 지정하는 것이 가장 좋습니다.

호출이 있고 응답이 있으므로 콜백이라고 합니다.

콜백과 디자인 패턴

콜백 패턴은 전략 패턴과 매우 유사하지만, 개인적으로 초점이 다르기 때문에 미묘한 차이가 있다고 생각합니다.

콜백은 다음과 같습니다.

전략 패턴은 다음과 같습니다.

전략 모드에서 호출 수신자는 일반적으로 스레드 풀 거부 전략과 같이 선택할 여러 전략을 미리 정의합니다. 하지만 거부 정책을 맞춤설정할 수도 있습니다.

전략모드에서도 콜백이 가능하다고 하면 좀 말이 안되는데... 둘의 출발점이 다릅니다. 그러나 장면을 바꿔보면 그 둘이 여전히 근본적으로 다르다는 것을 알게 될 것입니다. 예를 들어 시스템 간 콜백은 다음과 같습니다.

프로세스 내 메서드 호출과 달리 시스템 간 호출에는 추가 IP+포트가 필요합니다.

현재로서는 일반적으로 누구도 이를 "전략 모드"라고 부르지 않을 것입니다.

콜백과 매우 유사해 보이지만 시작점이 다소 다른 관찰자 모드도 마찬가지입니다. 관찰자 패턴의 시작점은 이벤트 소스가 변경될 때 알림을 받는 것인 반면 콜백은 손상된 단계 분할과 비슷합니다. 물론, 다시 말하지만, 이 본질이 같다고 생각한다면 그렇게 생각해도 괜찮고, 정의에 얽매일 필요는 없습니다.

콜백 및 IO 모델

많은 사람들이 BIO, NIO 및 AIO에 대해서도 연구했습니다. AIO에는 CompletionHandler 인터페이스를 정의하는 콜백 메커니즘도 있습니다.

I/O 작업이 완료되면 운영 체제는 자동으로 done()을 다시 호출합니다. 따라서 이 메커니즘을 사용하여 콜백 함수를 미리 작성할 수 있습니다.

일반적으로 콜백은 크거나 작을 수 있는데, 거시적인 것에는 JVM 내의 콜백 기능과 시스템 간의 콜백 인터페이스가 포함되고, 미시적인 것에는 운영 체제의 콜백 메커니즘이 포함됩니다. 토크쇼에도 콜백이 있습니다.

모두를 위한 작은 유머.

반영: 콜백 및 동기화, 비동기, 차단, 비차단

우리는 일반적으로 비동기식을 "처리 속도를 높일 수 있다"고 말합니다. 이는 하위 스레드가 시간이 많이 걸리는 작업을 처리하는 동안 메인 스레드가 Hua Luogeng 교수의 "물을 끓여 차를 만드는 것"처럼 계속해서 자체 작업을 수행할 수 있음을 의미합니다. 이론.

물을 끓이는 동안 찻잔을 씻는 것이 실제로 어느 정도 효율성을 향상시킬 수 있다는 것은 부인할 수 없는 사실입니다(둘 사이에는 종속성이 없습니다). 그러나 차를 만드는 것은 물이 끓을 때까지 기다려야 합니다(의존성이 있습니다). 즉, 핵심 질문은 "결과를 얻고 싶은지 여부"입니다(종속성이 있음). 결과를 원하지 않는 경우 실제로 직접 반환할 수 있어 훨씬 빠릅니다.

이것으로부터 우리는 대부분의 초보자들을 혼란스럽게 하는 네 가지 개념을 도출할 수 있습니다.

  • 동기 차단
  • 동기식 비차단
  • IO 멀티플렉싱
  • 비동기 비차단

이러한 개념을 이해하는 핵심은 다음에 있습니다.호출자가 결과를 얻는 방법(활성 또는 수동)과 결과를 얻을 때 호출자의 상태(차단 또는 비-차단) 블로킹).

동기화 및 비동기성에 중점을 둡니다메시지 통신 메커니즘(동기 통신/비동기 통신):

  • 소위 동기화란 *호출*을 실행할 때결과를 얻을 때까지 *호출*이 반환되지 않음을 의미합니다. 그러나 일단 호출이 반환되면 반환 값을 얻게 됩니다. 즉, *발신자*는 이 *호출*의 결과를 적극적으로 기다립니다.
  • 비동기식은 그 반대입니다.*호출이 실행된 후* 호출이 직접 반환되므로 결과가 반환되지 않습니다. 즉, 비동기 프로시저 호출이 실행될 때 호출자는 결과를 즉시 얻지 못합니다. 그러나 *전화*가 발행된 후 *수신자*는 상태, 알림 또는 콜백 함수< a i=를 통해 호출자에게 알립니다. 5>이 통화 처리

차단 및 비차단 초점호출 결과(메시지, 반환 값)를 기다릴 때 프로그램 상태:

  • 차단 호출은 호출 결과가 반환되기 전에 현재 스레드가 일시 중단됨을 의미합니다. 호출 스레드는 결과를 얻은 후에만 반환됩니다.
  • 비차단 호출은 결과를 즉시 얻을 수 없을 때까지 호출이 현재 스레드를 차단하지 않음을 의미합니다.

우리가 일반적으로 "빠르다"고 생각하는 "비동기 프로그래밍"으로 돌아가 보겠습니다.

사실IO 모델의 동기화 및 비동기화그리고 우리가 "동기화 및 비동기화"라고 부르는 것 일상적인 개발에서 두 가지 다른 개념이 있으므로 혼동하지 마십시오. NIO를 예로 들어보겠습니다. 인터넷의 일부 블로그에서는 NIO가 비동기식이며 비차단이라고 말하지만 실제로 IO 모델에서는 동기식이며 비차단입니다. 오직 AIO만이 진정한 비동기식이며 비차단입니다. 학술 연구를 하는 것이 아니기 때문에 엄격하게 구분할 필요는 없습니다. 여러 IO 모델을 명확하게 구분할 수 있는 한 멀티 스레딩 시나리오의 기본 일상 사용을 "비동기"라고도 합니다.

마지막으로, 일상 개발 과정에서 다음과 같은 내용을 본 학생들이 있나요?

타사 클라이언트는 비동기 호출 및 콜백 메서드를 모두 제공합니다.

위의 설명을 바탕으로 이 두 가지 방법은 어떤 시나리오에 적합합니까?

저자 소개: 안녕하세요 여러분. 저는 ZTE와 Meituan의 전 설계자이자 현재 인터넷 회사의 CTO인 Brother Smart입니다.

그룹에 가입하여 함께 배우고 함께 발전하며 함께 인터넷 겨울을 이겨냅시다

추천

출처blog.csdn.net/smart_an/article/details/134918720