비동기식 호출
Asynchronous method invocation멀티스레드 컴퓨터 프로그래밍에서 비동기식 호출 또는 비동기식 패턴이라고도 하는 비동기식 호출(AMI)은 호출된 코드가 끝나기를 기다리는 동안 콜 사이트가 차단되지 않는 설계 패턴이다.대신, 회신이 도착하면 호출 스레드가 통지된다.회답에 대한 투표는 원치 않는 선택이다.
배경
AMI는 잠재적으로 장기간 실행될 수 있는 객체의 비동기적 호출에 대한 설계 패턴이다.[1]1996년 앨런 버멀런이 설명한 IOU("신세를 졌다") 패턴과 맞먹는다.[2][3]
대부분의 프로그래밍 언어에서 호출된 메서드는 호출된 실행 스레드(즉, 호출된 실행 스레드에서는 호출된 메서드가 호출된다.예를 들어, 인터넷을 통해 데이터를 로드하는 등 메서드가 완료되는 데 시간이 오래 걸리는 경우 메서드가 완료될 때까지 호출 스레드가 차단된다.이를 원하지 않을 경우, "worker srad"를 시작하고 거기서 그 방법을 호출할 수 있다.대부분의 프로그래밍 환경에서 이것은 특히 많은 스레드를 만들 때 발생할 수 있는 오버헤드를 피하기 위해 주의를 기울이는 경우 많은 코드 라인을 필요로 한다.AMI는 이 문제를 해결하는데, 이는 완료 알림을 쉽게 받거나 나중에 완료되기를 기다리는 추가 방법과 함께, 즉시 반환되는 "비동기" 변종과 함께 잠재적으로 장기 실행("동기화")되는 개체 방식을 증강한다는 것이다.
AMI의 한 가지 일반적인 용도는 활성 객체 설계 패턴에 있다.대안은 동기식 방식 호출과 미래 객체다.[4]AMI를 사용할 수 있는 애플리케이션의 예로는 모든 이미지가 로드되기 전에 웹 페이지를 표시해야 하는 웹 브라우저가 있다.
방법은 특별한 절차인 만큼 비동기식 절차 호출은 비동기식 절차 호출의 특수한 경우다.
구현
자바 클래스
Java의 FutureTask 클래스는[5] 이벤트를 사용하여 동일한 문제를 해결한다.이 패턴은 구현 시 오버헤드가 더 많이 발생하는 AMI의 변형이지만, 소프트웨어 구성요소를 나타내는 개체에는 유용하다.
.NET Framework
- APM(비동기 프로그래밍 모델) 패턴(이전 사용)NET Framework 2.0)[6]
- 이벤트 기반 비동기 패턴(EAP)(에서 사용됨)NET Framework 2.0)[7]
- 태스크 기반 TAP(비동기식 패턴) (에서 사용됨).NET Framework 4.0)[8]
예
다음 예는 에 사용된 표준 AMI 스타일에 느슨하게 기초하고 있다.NET Framework.[9]주어진 방법Accomplish
, 하나는 두 가지 새로운 방법을 추가한다.BeginAccomplish
그리고EndAccomplish
:
계급 예 { 결과 달성하다(아그 …) IAsyncResult 비긴어컴퍼니시(아그 …) 결과 EndAccomfilish(IAsyncResult a) … }
부르면 바로BeginAccomplish
, 클라이언트는 즉시 유형 객체를 수신함AsyncResult
(그것을 구현함)IAsyncResult
인터페이스)를 사용하여 관련 없는 작업으로 호출 스레드를 계속할 수 있다.가장 간단한 경우, 결국 그런 일은 더 이상 없고, 고객은 전화를 한다.EndAccomplish
(기존에 수신된 객체에 대한 변경) 메서드가 완료되고 결과를 사용할 수 있을 때까지 차단한다.[10]그AsyncResult
일반적으로 개체는 클라이언트가 장기 실행 방법이 이미 완료되었는지 여부를 쿼리할 수 있는 적어도 하나의 방법을 제공한다.
접점 IAsyncResult { 바가지 긁다 HasCompleted() … }
콜백 방식도 에 전달할 수 있다.BeginAccomplish
, 장기 실행 메서드가 완료될 때 호출할 것.그것은 보통 전화한다.EndAccomplish
장기 실행 방법의 반환 값을 구한다.콜백 메커니즘의 문제는 콜백 기능이 원래 콜백 스레드가 아닌 작업자 스레드에서 자연스럽게 실행되어 레이스 상태를 유발할 수 있다는 것이다.[11][12]
에서NET Framework 설명서, 이벤트 기반 비동기 패턴이라는 용어는 대체 API 스타일(이후 사용 가능)을 가리킨다.NET 2.0) 명명된 방법을 사용하여AccomplishAsync
대신에BeginAccomplish
.[13][14] 피상적인 차이점은 이러한 방식에서 장기 실행 방식의 반환 값이 콜백 방식으로 직접 전달된다는 것이다.더욱 중요한 것은 API가 콜백 메서드를 실행하기 위해 특별한 메커니즘을 사용한다는 것이다(콜백 메서드는 유형 이벤트 객체에 있음).AccomplishCompleted
)이(가) 있는 동일한 스레드에서BeginAccomplish
부름을 받았다.이것은 경주 조건의 위험을 제거하여 API를 사용하기 쉽고 소프트웨어 구성요소에 적합하게 만든다. 반면에 이러한 패턴의 구현은 추가적인 객체 생성과 동기화 오버헤드를 수반한다.[15]
참조
- ^ "Asynchronous Method Invocation". Distributed Programming with Ice. ZeroC, Inc. Archived from the original on 5 January 2008. Retrieved 22 November 2008.
- ^ Vermeulen, Allan (June 1996). "An Asynchronous Design Pattern". Dr. Dobb's Journal. Retrieved 22 November 2008.
- ^ Nash, Trey (2007). "Threading in C#". Accelerated C# 2008. Apress. ISBN 978-1-59059-873-3.
- ^ Lavender, R. Greg; Douglas C. Schmidt. "Active Object" (PDF). Archived from the original (PDF) on 2012-09-24. Retrieved 22 November 2008.
{{cite journal}}
:Cite 저널은 필요로 한다.journal=
(도움말) - ^ "Class FutureTask". Oracle. 2011. Archived from the original on 2013-06-25. Retrieved 2015-06-29.
- ^ "Asynchronous Programming Model". Microsoft. 2015. Retrieved 2015-06-29.
- ^ "Event-based Asynchronous Pattern Overview". Microsoft. 2015. Retrieved 2015-06-29.
- ^ "Task-based Asynchronous Pattern". Microsoft. 2015. Retrieved 2015-06-29.
- ^ "Asynchronous Programming Design Patterns". .NET Framework Developer's Guide. Microsoft Developer Network. Archived from the original on 22 November 2008. Retrieved 22 November 2008.
- ^ "Asynchronous Programming Overview". .NET Framework Developer's Guide. Microsoft Developer Network. Archived from the original on 7 December 2008. Retrieved 22 November 2008.
- ^ "Using an AsyncCallback Delegate to End an Asynchronous Operation". .NET Framework Developer's Guide. Microsoft Developer Network. Archived from the original on 23 December 2008. Retrieved 22 November 2008.
- ^ "Concurrency Issues". Distributed Programming with Ice. ZeroC, Inc. Archived from the original on 28 March 2008. Retrieved 22 November 2008.
- ^ Christian Nagel; Bill Evjen; Jay Glynn; Karli Watson & Morgan Skinner (2008). "Event-based Asynchronous Pattern". Professional C# 2008. Wiley. pp. 570–571. ISBN 9780470191378.
- ^ "Multithreaded Programming with the Event-based Asynchronous Pattern". .NET Framework Developer's Guide. Microsoft Developer Network. Archived from the original on 25 December 2008. Retrieved 22 November 2008.
- ^ "Deciding When to Implement the Event-based Asynchronous Pattern". .NET Framework Developer's Guide. Microsoft Developer Network. Archived from the original on 22 November 2008. Retrieved 22 November 2008.
추가 읽기
- Chris Sells & Ian Griffiths (2007). "Appendix C.3: The Event-Based Asynchronous Pattern". Programming WPF. O'Reilly. pp. 747–749. ISBN 9780596510374.
- C#에서 비동기 메서드 호출 사용