비동기식 호출은 항상 새로운 스레드를 생성합니까? 둘의 차이점은 무엇입니까?
비동기 호출은 항상 새 스레드를 작성하거나 사용합니까?
컴퓨터 프로그래밍에서 비동기 이벤트는 기본 프로그램 흐름과 독립적으로 발생하는 이벤트입니다. 비동기 작업은 비 차단 구성표에서 실행되는 작업으로 기본 프로그램 흐름에서 처리를 계속할 수 있습니다.
단일 스레드에서 비동기 호출을 수행 할 수 있다는 것을 알고 있습니까? 이것이 어떻게 가능한지?
비동기식 호출은 항상 새로운 스레드를 생성합니까? 둘의 차이점은 무엇입니까?
비동기 호출은 항상 새 스레드를 작성하거나 사용합니까?
컴퓨터 프로그래밍에서 비동기 이벤트는 기본 프로그램 흐름과 독립적으로 발생하는 이벤트입니다. 비동기 작업은 비 차단 구성표에서 실행되는 작업으로 기본 프로그램 흐름에서 처리를 계속할 수 있습니다.
단일 스레드에서 비동기 호출을 수행 할 수 있다는 것을 알고 있습니까? 이것이 어떻게 가능한지?
답변:
이 질문은 대답하기에는 너무 일반적입니다.
일반적인 경우 비동기 호출이 반드시 새 스레드를 생성하지는 않습니다. 기존 스레드 풀 또는 외부 프로세스가 다른 방법으로 구현하는 한 가지 방법입니다. 언어, 객체 모델 (있는 경우) 및 런타임 환경에 따라 크게 달라집니다.
비동기는 호출 스레드가 응답을 기다리지 않고 호출 스레드에서 비동기 활동이 발생하지 않음을 의미합니다.
그 외에도 더 구체적이어야합니다.
비동기식으로 발생해야하는 작업이 CPU 작동을 요구하지 않을 때마다 다른 스레드를 생성하지 않고도 해당 작업을 수행 할 수 있습니다. 예를 들어, 비동기 작업이 I / O 인 경우 CPU는 I / O가 완료 될 때까지 기다릴 필요가 없습니다. 작업을 시작하기 만하면 I / O 하드웨어 (디스크 컨트롤러, 네트워크 인터페이스 등)가 I / O 작업을 수행하는 동안 다른 작업으로 넘어갈 수 있습니다. 하드웨어는 CPU를 중단하여 CPU가 완료되면 CPU에 알리고 OS는 응용 프로그램에 이벤트를 전달합니다.
종종 상위 레벨 추상화 및 API는 OS 및 기본 하드웨어에서 사용 가능한 기본 비동기 API를 공개하지 않습니다. 이 경우 스폰 된 스레드가 I / O 작업을 대기하는 경우에도 일반적으로 비동기 작업을 수행하기 위해 스레드를 만드는 것이 더 쉽습니다.
비동기 작업에서 CPU가 작동해야하는 경우 일반적으로 해당 작업이 다른 스레드에서 발생하여 실제로 비동기가되어야합니다. 그럼에도 불구하고 하나 이상의 실행 단위가있는 경우 실제로 비동기식입니다.
아니요, 비동기 호출에 항상 스레드가 포함되는 것은 아닙니다.
그들은 일반적으로 호출자와 병행하여 일종의 작업을 시작합니다. 그러나이 작업은 다른 프로세스, OS, 다른 하드웨어 (디스크 컨트롤러와 같은), 네트워크의 다른 컴퓨터 또는 사람에 의해 처리 될 수 있습니다. 스레드가 병렬로 작업을 수행하는 유일한 방법은 아닙니다.
JavaScript는 단일 스레드 및 비동기입니다. 예를 들어 XmlHttpRequest를 사용하면 응답이 반환 될 때 비동기 적으로 실행될 콜백 함수를 제공합니다.
John Resig는 타이머가 JavaScript에서 작동 하는 방식에 대한 관련 문제에 대해 잘 설명하고 있습니다 .
멀티 스레딩은 동일한 프로세스에서 발생하는 둘 이상의 작업을 말합니다. 비동기 프로그래밍은 여러 프로세스에 퍼져 있습니다. 예를 들어 내 작업이 웹 서비스를 호출하는 경우 스레드는 웹 서비스가 반환 될 때까지 기다릴 필요가 없습니다. 여기에서는 스레드가 다른 시스템의 프로세스가 완료 될 때까지 기다리지 않도록하는 비동기 프로그래밍을 사용합니다. 그리고 웹 서비스로부터 응답을 받기 시작할 때 웹 서비스가 요청 처리를 완료했다고 말하는 메인 스레드를 중단시킬 수 있습니다. 이제 메인 스레드가 결과를 처리 할 수 있습니다.
실제 스레드를 지원하기 전에 메시지 루프를 사용하여 비 선점 시간 (버전 2.13, 3.0, 3.1 등) 이후 Windows는 항상 비동기 처리를 수행했습니다. 따라서 귀하의 질문에 대답하기 위해 비동기 처리를 수행하기 위해 스레드를 만들 필요는 없습니다.
비동기 호출은 호출을 호출하는 것과 동일한 시스템 / 장치에서 발생할 필요조차 없습니다. 따라서 질문이 있다면, 비동기 호출이 현재 프로세스에서 스레드를 요구합니까? 답은 아니오입니다. 그러나 비동기 요청을 처리하는 어딘가에 실행 스레드가 있어야합니다.
실행 스레드는 모호한 용어입니다. 초기 Macintosh 및 Windows OS와 같은 협업 작업 시스템에서 실행 스레드는 요청이 다른 스택, 명령 포인터 등을 실행하게 한 것과 동일한 프로세스 일 수 있습니다. 그러나 사람들이 일반적으로 비동기 호출에 대해 이야기 할 때 이는 일반적으로 다른 스레드가 프로세스 내 (예 : 동일한 프로세스 내) 인 경우 또는 다른 프로세스가 프로세스 간인 경우 다른 스레드에 의해 처리되는 호출을 의미합니다.
프로세스 간 (또는 프로세스 간) 통신 (IPC)은 일반적으로 프로세스 간 통신을 포함하도록 일반화됩니다. 데이터 잠금 및 동기화 기술은 별도의 실행 스레드가 실행되는 프로세스에 관계없이 일반적으로 동일하기 때문입니다.
일부 시스템에서는 콜백을 사용하는 일부 기능에 대해 커널의 동시성을 활용할 수 있습니다. 다소 모호한 인스턴스의 경우 비동기 IO 콜백을 사용하여 Mac 시스템 6-8의 선점없는 멀티 태스킹 시대에 비 차단 인터넷 서버를 다시 구현했습니다.
당신이 스레드없이 프로그램 "의"동시 실행을이 방법은 스트림 과 같은 .
비동기는 단지 무언가 (함수 호출, 장치 등)가 끝나기를 기다리는 프로그램을 차단하지 않음을 의미합니다. 별도의 스레드로 구현할 수 있지만 동기 작업에 전용 스레드를 사용하고 일종의 이벤트 시스템을 통해 통신하여 비동기식 동작을 수행하는 것도 일반적입니다.
단일 스레드 비동기 프로그램의 예가 있습니다. 다음과 같은 것 :
...do something
...send some async request
while (not done)
...do something else
...do async check for results
비동기 호출의 특성은 호출이 진행되는 동안 응용 프로그램을 계속 실행하려면 새 스레드 를 생성 하거나 최소한 활용해야합니다. 이의 목적으로 만 만든 또 다른 스레드에게 당신을 비동기 콜백 처리
경우에 따라 상황에 따라 비동기 메소드를 호출하려고하지만 사용자에게 동기식으로 보이도록 할 수 있습니다 (예 : 비동기 메소드가 완료되었다는 신호가 표시 될 때까지 차단). 이것은 WaitForSingleObject 와 같은 Win32 API를 통해 달성 할 수 있습니다 .