>  기사  >  백엔드 개발  >  콜백 함수란 무엇입니까?

콜백 함수란 무엇입니까?

零下一度
零下一度원래의
2017-06-28 16:16:371011검색

콜백 함수란 무엇인가요?


이 질문에 답하기 위해 잠시 우회해 보겠습니다.

프로그래밍은 시스템 프로그래밍과 응용 프로그래밍이라는 두 가지 범주로 나뉩니다. 간단히 말해서, 소위 시스템 프로그래밍은 라이브러리를 작성하는 것이고, 애플리케이션 프로그래밍은 다양한 작성된 라이브러리를 사용하여 특정 기능을 가진 프로그램, 즉 애플리케이션을 작성하는 것입니다. 시스템 프로그래머는 애플리케이션 프로그래머가 사용하기 위해 작성한 라이브러리에 대해 일부 인터페이스, 즉 API(애플리케이션 프로그래밍 인터페이스, 애플리케이션 프로그래밍 인터페이스)를 남겨 둡니다. 따라서 추상화 계층 다이어그램에서 라이브러리는 애플리케이션 아래에 있습니다.

프로그램이 실행 중일 때 일반적인 상황에서 응용 프로그램은 API를 통해 라이브러리에 미리 준비된 함수를 호출하는 경우가 많습니다. 그러나 일부 라이브러리 함수는 대상 작업을 완료하기 위해 적절한 시간에 호출될 수 있도록 애플리케이션이 먼저 함수를 전달하도록 요구합니다. 전달되어 나중에 호출되는 함수를 콜백 함수라고 합니다.

예를 들어, 호텔에서는 모닝콜 서비스를 제공하지만 손님이 어떻게 깨울지 결정해야 합니다. 객실에 전화를 걸 수도 있고, 웨이터를 보내 문을 두드릴 수도 있고, 일이 늦어질까봐 잠을 자면 머리에 대야 물을 부어달라고 요청할 수도 있습니다. 여기서 "wake up" 행위는 호텔에서 제공하는 것으로 도서관 기능과 동일하지만, 기상 방법은 승객이 결정하여 호텔에 알려주는 콜백 기능이다. 승객이 호텔에 자신을 깨우는 방법을 알려주는 행위, 즉 콜백 함수를 라이브러리 함수에 전달하는 행위를 호출하여 콜백 함수를 등록한다. 아래 그림과 같이(이미지 출처: Wikipedia):


보시다시피 콜백 함수는 일반적으로 애플리케이션과 동일한 추상화 계층에 있습니다(어떤 종류의 콜백 함수가 전달되는지는 애플리케이션 수준에서 결정되기 때문입니다). . 콜백은 상위 계층이 하위 계층을 호출하고, 하위 계층이 상위 계층을 호출하는 과정이 된다. (제 생각에는) 이것이 콜백의 가장 초기 적용이어야 하며 그렇게 명명된 이유입니다.

콜백 메커니즘의 장점

위의 예에서 볼 수 있듯이 콜백 메커니즘은 뛰어난 유연성을 제공합니다. 이제부터 다이어그램에서 라이브러리 함수를 중간 함수라고 부르는데, 이는 콜백이 애플리케이션과 라이브러리 사이에서만 사용되는 것이 아니기 때문입니다. 위의 상황과 유사한 유연성을 원할 때마다 콜백을 활용할 수 있습니다.

이런 유연성은 어떻게 달성되나요? 언뜻보기에 콜백은 단지 함수 간의 호출인 것처럼 보이지만 잘 생각해보면 둘 사이의 주요 차이점을 찾을 수 있습니다. 콜백에서는 특정 메소드를 사용하여 콜백 함수를 중간 함수에 전달합니다. 매개변수. 콜백 함수가 전달되기 전에는 중간 함수가 불완전하다는 것을 이해할 수 있습니다. 즉, 프로그램은 런타임에 다양한 콜백 함수를 등록하여 중간 함수의 동작을 결정하고 변경할 수 있습니다. 이는 단순한 함수 호출보다 훨씬 더 유연합니다. Python으로 작성된 다음의 간단한 콜백 예를 살펴보십시오.

`even.py`
#回调函数1#生成一个2k形式的偶数def double(x):    return x * 2    #回调函数2#生成一个4k形式的偶数def quadruple(x):    return x * 4
`callback_demo.py`
from even import *#中间函数#接受一个生成偶数的函数作为参数#返回一个奇数def getOddNumber(k, getEvenNumber):    return 1 + getEvenNumber(k)    #起始函数,这里是程序的主函数def main():        k = 1    #当需要生成一个2k+1形式的奇数时    i = getOddNumber(k, double)    print(i)    #当需要一个4k+1形式的奇数时    i = getOddNumber(k, quadruple)    print(i)    #当需要一个8k+1形式的奇数时    i = getOddNumber(k, lambda x: x * 8)    print(i)    if __name__ == "__main__":    main()


`callback_demp.py`를 실행하면 출력은 다음과 같습니다.

3
5
9


위 코드에서는 `getOddNumber`에 다양한 콜백 함수가 전달되며 성능도 다릅니다. 이것이 콜백 메커니즘의 장점입니다. 위의 세 번째 콜백 함수는 익명 함수라는 점을 언급할 가치가 있습니다.

쉽게 간과되는 제3자

위의 논의에서 우리는 중간 함수와 콜백 함수가 콜백의 두 가지 필수 부분이라는 것을 알 수 있지만, 사람들은 콜백의 세 번째 중요한 부분인 호출자를 종종 무시합니다. 중간 기능. 대부분의 경우 이 호출자는 프로그램의 주요 함수와 동일시될 수 있지만 차이점을 표현하기 위해 여기서는 이를 시작 함수라고 부릅니다(위 코드의 주석에 표시됨).

제가 이 제3자를 특별히 강조하는 이유는 온라인에서 관련 기사를 읽을 때 많은 사람들이 단순히 두 개인 간의 통화로 이해하고 있다는 인상을 받았기 때문입니다. 예를 들어, 많은 중국어 웹페이지에서는 "콜백"을 설명할 때 "전화하시면 다시 전화하겠습니다."라는 문장을 언급합니다. 이 문장의 영어 소스를 찾지 못했습니다. 나는 개인적으로 많은 사람들이 초기 함수와 콜백 함수를 하나로 간주한다고 추측합니다. 아마도 두 가지 이유가 있을 것입니다. 첫째, "콜백"이라는 이름이 오해의 소지가 있을 수 있습니다. 둘째, 중간 함수에 전달되는 콜백 함수는 무엇입니까? 시작 기능에서 결정됩니다. 사실 콜백은 '너와 나'의 상호작용이 아니라 ABC의 3자간 연결이다. 이러한 명확한 개념을 사용하면 자신의 코드에서 콜백을 구현할 때 혼란과 오류가 발생할 가능성이 줄어듭니다.

또한 실제로 콜백에는 차단 콜백과 지연 콜백이라는 두 가지 유형이 있습니다. 둘 사이의 차이점은 차단 콜백에서는 초기 함수가 반환되기 전에 콜백 함수가 발생해야 하지만 지연된 콜백에서는 초기 함수가 반환된 후에 콜백 함수가 호출될 수 있다는 것입니다. 여기서는 이 두 가지 확률을 더 깊이 논의하지 않을 것입니다. 이는 시작 기능을 강조하는 것의 중요성을 설명하기 위한 것입니다. 인터넷의 많은 기사에서는 이 두 가지 개념을 언급할 때 일반적으로 메인 호출 함수가 반환되기 전에 콜백 차단이 발생한다고 말하지만 메인 호출 함수가 시작 함수인지 중간 함수인지 명확하지 않아 사람들을 혼란스럽게 만듭니다. 그래서 여기에 특별한 설명이 있습니다. 또한 이 문서의 예에서는 콜백을 차단하고 있습니다. 지연된 콜백에는 일반적으로 멀티스레딩이 포함됩니다. 아직 완전히 이해하지 못했기 때문에 여기서는 더 이상 설명하지 않겠습니다.

여기서 요약하자면, 일반적으로 시스템에서 다양한 API 함수를 사용하는 함수를 작성하고 필요할 때 작성한 함수를 호출합니다. 이제는 상황이 반전되어 먼저 시스템을 호출하지 않는 함수를 작성합니다. API를 만든 다음 시스템 API를 통해 이미 작성된 함수를 호출하면 우리가 작성한 함수가 콜백 함수가 됩니다.


위 내용은 콜백 함수란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.