2014-11-13 3 views

답변

6

async 메서드가 주 스레드에서 실행되는 동안 스레드가 독립적으로 스케줄 가능합니다. 즉, coroutines입니다. 예를 들어, 별도의 스레드에서 소켓 읽기를 차단하면 응용 프로그램을 계속 실행할 수 있지만 async 메서드에서 이렇게하면 응용 프로그램이 차단됩니다.

스레드 및 coroutines (async 메서드)는 동일한 문제 중 일부를 해결할 수 있지만 일반적으로 다른 작업을 수행합니다. Gtk + (및 다른 많은 GUI 시스템)에서는 하나의 스레드 만 GUI 객체를 조작 할 수 있으며 GUI 객체의 이벤트는이 스레드 (일반적으로 이벤트 발송 스레드라고 함)에서 발생합니다. 다른 스레드가 GUI 항목에 액세스하려고하면 a) 잠금 절차를 거치거나 b) EDT에 메시지를 보내야합니다. 이것은 모든 스레드 간 통신에 일반적입니다 : 스레드간에 통신하거나 공유 자원을 사용하려면 잠금 및 통신이 필요합니다.

코 루틴은 EDT에서 "다른 이벤트"로 실행됩니다. 다운로드 버튼이있는 창이있는 상황을 생각해보십시오. 사용자가 버튼을 클릭하면 EDT가 버튼과 관련된 클릭 핸들러를 시작합니다. 해당 코드가 실제로 파일을 다운로드하려고 시도하면 파일 다운로드가 완료 될 때까지 GUI가 고정됩니다. 동시 루틴이 시작된 경우 버튼 처리기는 async 메서드를 시작하여 소켓을 열고 아직 준비되지 않았 음을 알립니다. 그런 다음 소켓과 콜백을 EDT의 루프 (GLib.MainLoop)에 넣습니다. 버튼의 핸들러가 끝나고 EDT가 앉아서 X 디스플레이 또는 소켓에서 이벤트를 기다린 다음 올바른 콜백을 호출하여 처리합니다. 이를 통해 GUI 이벤트를 소켓 이벤트와 인터리브 방식으로 처리 할 수 ​​있습니다. 그러나 한 번에 하나의 처리기 만 작동 할 수 있으므로 처리기를 빨리 완료해야하거나 응용 프로그램이 응답하지 않아야합니다.

coroutines를 사용하면 콜백의 거대한 엉망이되지만 async 메서드는 콜백을 숨겨서 그렇지 않은 경우에도 직선 코드처럼 보이게합니다.

작업이 대부분 대기 중이면 코 루틴이 올바른 선택입니다. 당신의 작업이 바쁘다면 의심 할 여지없이 스레드에 들어갈 필요가있을 것입니다. Couroines는 하나 이상의 CPU 작업을 초과 할 수 없으며 스레드는 여러 CPU에서 병렬로 실행될 수 있습니다. GLib의 coroutines도 스레드와 쉽게 섞일 수 없습니다. async 메소드가 두 스레드에서 독립적으로 작동하도록하려고하는 것은 제정신이 아닙니다. 오직 EDT 만 async 메소드를 사용합니다.

+0

이 스레드는 매우 인기가 없기 때문에, 나는 내 자신이 의견에 당신을 감사하게 할 것입니다 !!! 고마워. – Kwaadpepper

관련 문제