비동기 프로그래밍과 병렬 프로그래밍의 차이점을 분명히 표현하는 방법은 무엇입니까?


139

많은 플랫폼이 응답 성을 향상시키기위한 수단으로 비동기 및 병렬 처리를 촉진합니다. 나는 그 차이를 일반적으로 이해하지만, 종종 내 자신의 마음과 다른 사람들에게 분명히 표현하기가 어렵다는 것을 알게됩니다.

나는 임시 프로그래머이며 비동기 및 콜백을 상당히 자주 사용합니다. 병렬성은 이국적이다.

그러나 나는 특히 언어 디자인 수준에서 쉽게 혼란스러워하는 것처럼 느낍니다. 그들이 어떻게 관련이 있는지 (또는 관련이 없는지), 그리고 각각이 가장 잘 적용되는 프로그램 클래스에 대한 명확한 설명을 좋아할 것입니다.


비동기 프로그래밍과 병렬 프로그래밍의 관계에 대한 블로그 게시물을 작성했습니다 – anat-async.blogspot.com/2018/08/…
Alexei Kaigorodov


6
병행 성은 일이 동시에 일어날 때입니다. 비동기 성은 작업 결과가 계속되기를 기다리지 않는 경우입니다. 당신은 잠을 자고 어느 시점에서 결과가오고, 종을 울리고, 일어나서 거기에서 계속합니다. 비동기 실행은 하나의 스레드에서만 완벽하게 연속적으로 발생할 수 있습니다. (그것은 거의 자바 스크립트가하는 일이다)
Thanasis Ioannidis

답변:


87

비동기식으로 무언가를 실행할 때 그것은 비 차단임을 의미하며, 그것이 완료 될 때까지 기다리지 않고 다른 것들을 계속 수행합니다. 병렬 처리는 동시에 여러 가지를 동시에 실행하는 것을 의미합니다. 병렬 처리는 작업을 독립적 인 작업으로 분리 할 때 효과적입니다.

3D 애니메이션의 프레임 렌더링을 예로 들어 보겠습니다. 애니메이션을 렌더링하는 데 시간이 오래 걸리므로 애니메이션 편집 소프트웨어에서 해당 렌더링을 시작하는 경우 UI가 잠기지 않고 다른 작업을 계속할 수 있도록 비동기식 으로 실행되고 있는지 확인해야합니다 . 이제 해당 애니메이션의 각 프레임을 개별 작업으로 간주 할 수도 있습니다. 여러 개의 CPU / 코어 또는 여러 머신을 사용할 수있는 경우 여러 프레임을 병렬 로 렌더링 하여 전체 워크로드 속도를 높일 수 있습니다.


내가 이것을 얻을 수 있는지 보자. 다른 프레임을 렌더링하는 병렬 작업은 여러 CPU / 코어에 분산되어야합니다. 그것은 작업 완료 시점 또는 해당 작업이 다른 것을 차단하는지 여부와 관련이 없습니다. 그것은 단지 많은 CPU가 그것을 함께 수행하여 하나의 초고속 CPU에서 실행되는 것처럼 결과를 사용할 수 있음을 의미합니다. 권리?

1
"애니메이션을 렌더링하는 데 시간이 오래 걸리므로 애니메이션 편집 소프트웨어 내에서 해당 렌더링을 시작하려면 (...)을 확인하십시오." 뭐?

3D 애니메이션 부분 : 우선, CPU에서 프레임을 생성하여 3D 그래픽 프로그램을 실행하지 마십시오. 둘째,이 작업을 수행하는 경우 (권장하지 않음) 타이머를 사용하여 렌더링 할 수있는 프레임 수를 측정합니다. 그렇지 않으면 완료되지 않은 렌더 호출 작업 스택을 만들 수 있습니다. 그러나 요점은 사용자 별 입력 이벤트를 기준으로 렌더링하는 대부분의 2D 렌더링 응용 프로그램에서 완벽하게 유효합니다.
ワ イ き ん ぐ

1
비동기 및 비 차단은 서로 다른 패러다임입니다.
Lorne의 후작

73

나는 주요한 차이점은 동시성병렬성 사이에 있다고 믿는다 .

비동기콜백 은 일반적으로 동시성을 표현하는 방법 (도구 또는 메커니즘)입니다. 즉, 서로 대화하고 리소스를 공유 할 수있는 일련의 엔티티입니다. 비동기 또는 콜백 통신의 경우에는 리소스 공유가 선택 사항 인 반면 (원격 시스템에서 결과가 계산되는 RMI 고려) 암시 적 통신입니다. 올바르게 언급했듯이 이것은 일반적으로 반응을 염두에두고 수행됩니다. 대기 시간 이 긴 이벤트를 기다리지 않습니다 .

병렬 프로그래밍은 일반적으로 처리량을 주요 목표로 삼는 반면 대기 시간, 즉 단일 요소의 완료 시간은 동등한 순차 프로그램보다 나쁠 수 있습니다.

동시성과 병렬성의 차이점을 더 잘 이해하기 위해 Daniele Varacca의 동시성대한 확률 모델 에서 인용 할 것입니다. 이는 동시성 이론에 대한 훌륭한 참고 사항입니다.

계산 모델은 시스템이 독립적 인 자율 구성 요소로 구성되어 서로 통신 할 수있는 동시성을위한 모델입니다. 동시성의 개념을 병렬 처리의 개념과 혼동해서는 안됩니다. 병렬 계산에는 일반적으로 여러 프로세서간에 작업을 분산시키는 중앙 제어가 포함됩니다. 동시성에서 구성 요소의 독립성과 서로 통신한다는 사실을 강조합니다. 병렬화는 바로가 결정하고 노예들이 일하는 고대 이집트와 같습니다. 동시성은 모든 사람이 원하는대로하고 휴대 전화를 사용하는 현대 이탈리아와 같습니다.

결론적 으로 병렬 프로그래밍은 별도의 엔터티가 협업하여 고성능 및 처리량 (일반적으로)을 얻는 특별한 동시성 사례입니다.

비동기 및 콜백은 프로그래머가 동시성을 표현할 수있는 메커니즘 일뿐입니다. 마스터 / 작업자 또는지도 / 축소와 같은 잘 알려진 병렬 프로그래밍 디자인 패턴은보다 복잡한 중앙 집중식 상호 작용 을 구현하기 위해 이러한 낮은 수준의 메커니즘 (비동기식)을 사용하는 프레임 워크에 의해 구현됩니다 .


37

이 기사는 그것을 잘 설명합니다 : http://urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming

비동기 프로그래밍에 대한 내용은 다음과 같습니다.

비동기 호출은 응용 프로그램 내에서 "차단"을 방지하는 데 사용됩니다. [이러한] 호출은 기존 스레드 (예 : I / O 스레드)에서 분리되고 가능한 경우 작업을 수행합니다.

병렬 프로그래밍에 대한 이것 :

병렬 프로그래밍에서는 여전히 작업이나 작업을 분리하지만 주요 차이점은 각 작업 덩어리에 대해 새 스레드를 가동한다는 것입니다

그리고 이것을 요약하면 :

비동기 호출시스템에서 이미 사용중인 스레드를 사용 하며 병렬 프로그래밍을 위해서는 개발자가 필요한 작업, 스핀 업 및 분리 스레드를 분리해야합니다 .


3
이 기사> 여기에 모든 답변이 있습니다 (물론 이것 하나는 제외!)
FellyTone84

1
링크 주셔서 감사합니다. 따라서 일반적으로 UI에서 서버로 (또는 클라이언트에서 웹 서비스로) 통신 할 때는 비동기 호출을 사용하십시오. 비즈니스 계층뿐만 아니라 서버 또는 웹 서비스 쪽에서도 병렬 스레딩을 사용하십시오.
goku_da_master

18

내 기본 이해는 :

비동기 프로그래밍은 다른 작업을 수행하기 전에 값 비싼 작업이 완료되기를 기다리는 문제를 해결합니다. 작업이 완료되기를 기다리는 동안 다른 작업을 수행 할 수 있다면 좋은 것입니다. 예 : 웹 서비스에서 더 많은 데이터를 검색하고 검색하는 동안 UI를 계속 실행합니다.

병렬 프로그래밍은 관련이 있지만 큰 작업을 동시에 계산할 수있는 더 작은 청크로 나누는 데 더 관심이 있습니다. 작은 청크의 결과를 결합하여 전체 결과를 생성 할 수 있습니다. 예 : 개별 픽셀의 색상이 본질적으로 독립적 인 광선 추적.

아마도 그보다 더 복잡 할 수도 있지만 이것이 기본적인 차이점이라고 생각합니다.


이것은 멋지게 넣어졌지만 꽤 잘못되었습니다. 비 동기화와 마찬가지로 병렬 처리를 통해 작업 완료를 기다리지 않고 제어 흐름을 계속 진행할 수 있습니다. 병렬 처리는 하드웨어에 따라 다릅니다.
serkan

13

나는이 용어의 차이점을 생각하는 경향이 있습니다.

비동기 : 돌아가서이 작업을 수행하십시오. 완료되면 다시 나와 결과를 가져 오십시오. 나는 그동안 다른 것들에 착수 할 것입니다.

병렬 :이 작업을 수행하고 싶습니다. 그것이 더 쉬워지면 도움을 청하십시오. 이것은 긴급한 일이므로 결과가 나올 때까지 기다립니다. 당신이 돌아 오기 전까지는 아무것도 할 수 없습니다.

물론 비동기 작업은 병렬 처리를 사용할 수 있지만 최소한 차별화는 작업이 수행되는 동안 다른 작업을 수행하거나 결과가 나올 때까지 모든 것을 완전히 중단하는지 여부입니다.


13

async : 다른 곳 에서 직접 수행 하고 완료되면 콜백하십시오. 그때까지 나는 내 일을 계속할 수 있습니다.

여기에 이미지 설명을 입력하십시오

병렬 : 원하는 수의 녀석 (스레드)을 고용하고 작업을 분할하여 더 빨리 완료하고 완료되면 알려주십시오 (콜백). 그때까지 나는 다른 일을 계속할 수도 있습니다 .

여기에 이미지 설명을 입력하십시오

가장 큰 차이점은 병렬 처리는 대부분 하드웨어에 달려 있습니다.


11

실행 순서의 문제입니다.

A가 B와 비동기이면 B의 하위 부분과 관련하여 A의 하위 부분이 언제 발생하는지 미리 예측할 수 없습니다.

A가 B와 병렬 인 경우 A의 작업은 B의 작업과 동시에 발생하지만 실행 순서는 여전히 정의 될 수 있습니다.

아마도 어려움은 비동기라는 단어가 모호하다는 것입니다.

버틀러에게 더 많은 와인과 치즈를 얻기 위해 가게에 달려가라고 말하고 비동기식 작업을 실행 한 다음 그를 잊고 연구실에서 다시 문을 두 드릴 때까지 소설에서 작업합니다. 병렬화가 여기서 일어나고 있지만 집사와 저는 근본적으로 다른 과제와 다른 사회 계급에 종사하고 있으므로 여기서는 그 레이블을 적용하지 않습니다.

각 하녀 팀이 서로 다른 창을 씻을 때 병행하여 일하고 있습니다.

내 경주 용 자동차 지원 팀은 각 팀이 서로 다른 타이어에서 작동하므로 업무를 수행하는 동안 서로 통신하거나 공유 리소스를 관리 할 필요가 없다는 점에서 비동기식으로 병렬 처리됩니다.

내 축구 (일명 축구) 팀은 각 플레이어가 필드에 대한 정보를 독립적으로 처리하고 그에 대한 정보를 이동함에 따라 병렬 작업을 수행하지만 다른 사람들의 의사 소통에 의사 소통하고 이에 대응해야하기 때문에 완전히 비동기 적이지는 않습니다.

각 플레이어가 음악을 읽고 악기를 제어함에 따라 내 행진 밴드도 평행하지만 동기화가 매우 빠릅니다. 서로 연주하고 행진합니다.

캐밍 된 개틀링 건은 병렬로 간주 될 수 있지만 모든 것이 100 % 동기 적이므로 하나의 프로세스가 진행되는 것처럼 보입니다.


9

왜 비동기인가?

오늘날의 응용 프로그램이 점점 더 연결성이 높아지고 잠재적으로 오래 실행되는 작업이나 네트워크 I / O 또는 데이터베이스 작업과 같은 작업을 차단함에 따라 이러한 작업을 백그라운드에서 시작하고 사용자 인터페이스로 다시 반환하여 대기 시간을 숨기는 것이 매우 중요합니다 가능한 빨리. 여기 비동기식 그림이 등장 합니다.

병렬 프로그래밍이 필요한 이유

오늘날의 데이터 세트가 커지고 계산이 더욱 복잡해집니다. 따라서이 경우 워크로드를 청크로 나눈 다음 해당 청크를 동시에 실행하여 이러한 CPU 바운드 작업의 실행 시간을 줄이는 것이 매우 중요합니다. 이것을 "Parallel"이라고 부를 수 있습니다. 분명히 응용 프로그램에 높은 성능 을 제공 합니다.


5

비동기 당신이 당신의 클라이언트의 연락 지점이고 당신이 응답 할 필요가 있습니다. 즉, 요청 될 때마다 상태, 운영의 복잡성, 필요한 자원 등을 공유해야한다고 가정 해 봅시다. 이제 시간이 오래 걸리는 작업이 있으므로 클라이언트에 24 시간 응답해야하므로이를 수행 할 수 없습니다. 따라서 시간이 많이 걸리는 작업을 다른 사람에게 위임하여 응답 할 수 있습니다. 이것은 비동기입니다.

병렬 프로그래밍 텍스트 파일에서 100 줄을 읽는 작업이 있고 한 줄을 읽는 데 1 초가 걸린다고 가정합니다. 따라서 텍스트 파일을 읽으려면 100 초가 걸립니다. 이제 작업이 완료 될 때까지 클라이언트가 100 초 동안 기다려야하는 것이 걱정됩니다. 따라서 9 개의 복제본을 더 만들고 각 텍스트 파일에서 10 개의 행을 읽도록합니다. 이제 100 라인을 읽는 데 걸리는 시간은 10 초입니다. 따라서 성능이 향상됩니다.

요약하면, 응답 성을 달성하기 위해 비동기 코딩이 수행되고 성능을 위해 병렬 프로그래밍이 수행됩니다.


4

비동기 : 차단하지 않고 백그라운드에서 메소드 또는 태스크를 실행합니다. 별도의 스레드에서 반드시 실행될 수는 없습니다. 컨텍스트 전환 / 시간 예약을 사용합니다.

병렬 작업 : 각 작업은 병렬로 실행됩니다. 컨텍스트 전환 / 시간 예약을 사용하지 않습니다.


4

나는 두 개념에 대해 상당히 편안하지만 여기에 분명하지 않은 점이 있습니다.

일부 답변을 읽은 후에는 차이점을 설명하는 정확하고 유용한 은유가 있다고 생각합니다.

개별 코드 줄을 별개이지만 주문한 카드로 생각하면 (오래된 학교 펀치 카드의 작동 방식을 설명하는 경우 저를 중지하십시오), 별도의 절차가 작성 될 때마다 고유 한 카드 스택을 갖게됩니다 ( copy & paste!) 및 코드를 정상적으로 및 비동기 적으로 실행할 때 일반적으로 수행되는 작업의 차이점은 관리 여부에 따라 다릅니다.

코드를 실행할 때 OS에 컴파일러에게 전달할 단일 작업 세트 (컴파일러 또는 인터프리터가 "상위"레벨 코드를 파기 한)를 전달합니다. 하나의 프로세서를 사용하면 한 번에 한 줄의 코드 만 실행할 수 있습니다. 따라서 여러 프로세스를 동시에 실행한다는 착시를 달성하기 위해 OS는 주어진 프로세스에서 한 번에 몇 줄만 프로세서를 전송하는 방식을 사용하여 모든 프로세스를 보는 방식에 따라 전환합니다. 적당한. 그 결과 최종 사용자에게 같은 시간에 진행 상황을 보여주는 여러 프로세스가 생성됩니다.

우리의 은유의 관계는 OS가 카드를 프로세서로 보내기 전에 항상 섞습니다. 카드 묶음이 다른 묶음에 의존하지 않으면 다른 묶음이 활성화 된 동안 그 묶음의 선택이 중단 된 것을 알 수 없습니다. 상관하지 않아도 상관 없습니다.

그러나주의를 기울이면 (예 : 서로 의존하는 여러 프로세스 또는 카드 스택이있는 경우) OS 셔플 링으로 인해 결과가 나빠질 수 있습니다.

비동기 코드를 작성하려면 순서가 무엇이든 관계없이 실행 순서 사이의 종속성을 처리해야합니다. 이것이 "콜백"과 같은 구조가 사용되는 이유입니다. 그들은 프로세서에게 "다음으로해야 할 일은 다른 스택에 우리가 한 일을 알리는 것"이라고 말합니다. 이러한 도구를 사용하면 다른 스택이 OS에서 더 이상 명령을 실행할 수 있도록하기 전에 다른 스택에 알릴 수 있습니다. ( "called_back == false 인 경우 : send (no_operation)"-이것이 실제로 어떻게 구현되는지 확실하지 않지만 논리적으로 일관성이 있다고 생각합니다.)

병렬 프로세스의 경우 차이점은 서로 신경 쓰지 않는 두 개의 스택과 처리 할 두 명의 작업자가 있다는 것입니다. 하루가 끝나면 두 스택의 결과를 결합해야 할 수도 있습니다.이 결과는 동기 문제이지만 실행을 위해 다시 신경 쓰지 않아도됩니다.

이것이 도움이되는지 확실하지 않지만 항상 여러 설명이 도움이됩니다. 또한 비동기 실행은 개별 컴퓨터 및 해당 프로세서로 제한되지 않습니다. 일반적으로 말하면 시간 또는 (보다 일반적으로 말하면) 이벤트 순서를 처리합니다. 따라서 종속 스택 A를 네트워크 노드 X로 보내고 연결된 스택 B를 Y로 보내는 경우 올바른 비동기 코드는 마치 랩톱에서 로컬로 실행되는 것처럼 상황을 설명 할 수 있어야합니다.


2

일반적으로 매번 둘 이상의 작업을 수행 할 수있는 방법은 두 가지뿐입니다. 하나는 비동기 이고 다른 하나는 병렬 입니다.

인기있는 서버 NGINX 및 유명한 Python 라이브러리 Tornado 와 같은 높은 수준에서 단일 스레드 서버가 수천 개의 클라이언트 (일부 IOloop콜백 )를 동시에 제공 할 수있는 비동기 패러다임을 완전히 활용합니다 . 비동기식 프로그래밍 패러다임을 구현할 수있는 ECF (예외 제어 추종)를 사용 합니다. 따라서 비동기는 실제로 동시에 작업을 수행하지 않지만 일부 io 바인딩 작업은 비동기 적으로 실제로 성능을 향상시킬 수 있습니다.

병렬 패러다임은 항상 멀티 스레딩 및 멀티 프로세싱을 의미합니다. 이것은 멀티 코어 프로세서를 완전히 활용할 수 있으며 실제로 동시에 작업을 수행 할 수 있습니다.


-1

위의 모든 답변 요약

  1. 병렬 컴퓨팅 :

▪ 처리량 문제를 해결합니다. 큰 작업을 더 작은 청크로 나누는 것과 관련이 있습니다.

▪ 머신 관련 (멀티 머신 / 코어 / CPU / 프로세서 필요)입니다 (예 : 마스터 슬레이브, 맵 감소).

병렬 계산에는 일반적으로 여러 프로세서간에 작업을 분산시키는 중앙 제어가 포함됩니다.

  1. 비동기식 :

▪ 대기 시간 문제, 즉 다른 작업을 수행하기 전에 값 비싼 작업을 완료하기 위해 '대기 중'문제를 해결합니다.

▪ 스레드 관련 (다중 스레드 필요)

스레딩 (Thread, Runnable, Executor 사용)은 Java에서 비동기 작업을 수행하는 기본 방법 중 하나입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.