Programing

코 루틴이란?

crosscheck 2020. 5. 19. 21:28
반응형

코 루틴이란?


코 루틴이란? 그것들은 동시성과 어떤 관련이 있습니까?


코 루틴과 동시성은 대체로 직교합니다. 코 루틴은 유량 제어가 복귀하지 않고 두 개의 서로 다른 루틴 사이에서 협력 적으로 통과되는 일반적인 제어 구조입니다.

파이썬의 'yield'문장이 좋은 예입니다. 코 루틴을 만듭니다. '수율'이 발생하면 기능의 현재 상태가 저장되고 제어는 호출 기능으로 돌아갑니다. 그러면 호출 함수는 실행을 양보 함수로 다시 전송할 수 있으며 상태는 '수율'이 발생한 지점으로 복원되고 실행이 계속됩니다.


에서 루아에서 프로그래밍 ", Coroutines"절 :

코 루틴은 스레드와 유사합니다 (멀티 스레딩의 의미). 자체 스택, 자체 로컬 변수 및 자체 명령 포인터가있는 실행 라인입니다. 그러나 그것은 전역 변수와 대부분 다른 코 루틴과 다른 것을 공유합니다. 스레드와 코 루틴의 주요 차이점은 개념적으로 (또는 문자 그대로 멀티 프로세서 시스템에서) 스레드가있는 프로그램이 여러 스레드를 병렬로 실행한다는 것입니다. 반면에 코 루틴은 협업 적입니다. 언제든지 코 루틴이있는 프로그램은 코 루틴 중 하나만 실행 중이며이 실행중인 코 루틴은 명시 적으로 일시 중지하도록 요청한 경우에만 실행을 일시 중단합니다.

요점은 코 루틴이 "협업"입니다. 다중 코어 시스템에서도 주어진 시간에 하나의 코 루틴 만 실행되지만 다중 스레드는 병렬로 실행될 수 있습니다. 코 루틴 사이에는 선점권이 없으며 실행중인 코 루틴은 실행을 명시 적으로 포기해야합니다.

" concurrency"의 경우 Rob Pike의 슬라이드를 참조 할 수 있습니다 .

동시성은 계산을 독립적으로 실행하는 구성입니다.

그래서 코 루틴 A의 실행 중에, 그것은 코 루틴 B로 제어 그리고 잠시 후, 코 루틴 B가 있으므로 코 루틴 A로 제어 다시 통과 통과 의존성 두 코 루틴은 그래서, 코 루틴 사이를, 그리고 그들이 협력하여 실행해야합니다 동시성 없습니다 .


기술적 인 질문이지만 대부분의 답변이 너무 기술적이라고 생각합니다. 나는 코 루틴 과정을 이해하려고 애썼다. 나는 그것을 얻는다. 그러나 나는 동시에 그것을 얻지 못한다.

이 답변이 매우 도움이되었다는 것을 알았습니다

https://dev.to/thibmaek/explain-coroutines-like-im-five-2d9

Idan Arye에서 인용하려면 :

당신의 이야기를 바탕으로, 나는 이것을 다음과 같이 넣었습니다.

만화를보기 시작했지만 소개입니다. 인트로를 보지 않고 게임으로 전환하여 온라인 로비에 입장하십시오. 그러나 3 명의 플레이어가 필요합니다. 다른 플레이어가 참여하기를 기다리는 대신 숙제로 전환하고 첫 번째 질문에 대답하십시오. 두 번째 질문에는 시청해야하는 YouTube 동영상에 대한 링크가 있습니다. 열면로드가 시작됩니다. 로드되기를 기다리는 대신 만화로 다시 전환하십시오. 소개가 끝났으므로 볼 수 있습니다. 이제 광고가 있습니다-그러나 다른 플레이어가 합류하여 게임으로 전환하는 등.

아이디어는 한 번에 모든 작업을 수행하는 것처럼 보이도록 작업을 실제로 빠르게 전환하지는 않는다는 것입니다. 당신은 당신의 직접적인 관심을 필요로하는 다른 일들을하기 위해 당신이 일어나는 것을 기다리는 시간을 사용합니다.

링크를 확실히 확인하면 모든 것을 인용 할 수없는 것이 훨씬 많습니다.


코 루틴은 서브 루틴 / 스레드와 유사합니다. 차이점은 호출자가 서브 루틴 / 스레드를 호출하면 호출자 함수로 다시 돌아 가지 않습니다. 그러나 코 루틴은 몇 가지 코드를 실행 한 후 호출자가 자신의 코드 중 일부를 실행하고 실행을 중지하고 계속 진행할 수있는 코 루틴 지점으로 돌아갈 수 있도록하여 호출자에게 다시 돌아올 수 있습니다. 즉. 코 루틴에는 둘 이상의 진입 점과 출구 점이 있습니다


  • 코 루틴은 코 틀린 언어에서 사용할 수있는 훌륭한 기능입니다
  • 코 루틴은 비동기 비 차단 코드를 작성하는 새로운 방법입니다.
  • 코 루틴은 가벼운 실입니다. 가벼운 스레드는 기본 스레드에 매핑되지 않으므로 프로세서의 컨텍스트 전환이 필요하지 않으므로 더 빠릅니다.
  • 네이티브 스레드에 매핑되지 않습니다
  • 코 루틴과 스레드는 모두 멀티 태스킹입니다. 그러나 차이점은 스레드가 OS에 의해 관리되고 사용자가 코 루틴을 관리한다는 것입니다.

기본적으로 두 가지 유형의 코 루틴이 있습니다.

  1. 스택리스
  2. 쌓다

Kotlin은 스택리스 코 루틴을 구현합니다. 즉, 코 루틴에는 자체 스택이 없으므로 네이티브 스레드에 매핑되지 않습니다.

코 루틴을 시작하는 기능은 다음과 같습니다.

launch{}

async{}

자세한 내용은 여기를 참조하십시오.

https://www.kotlindevelopment.com/deep-dive-coroutines/

https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9


다른 말로, 파이썬 gevent라이브러리에는 coroutine스레드를 만들고 파괴하는 오버 헤드없이 비동기 네트워크 요청과 같은 스레드와 같은 기능을 제공 하는 기반 네트워킹 라이브러리가 있습니다. 사용 된 coroutine라이브러리는 greenlet입니다.


에서 파이썬 코 루틴 :

파이썬 코 루틴의 실행은 여러 시점에서 일시 중지되고 재개 될 수 있습니다 (코 루틴 참조). 코 루틴 함수 본문 내에서 대기 및 비동기 식별자는 예약 키워드가됩니다. await 식, async for 및 async with는 코 루틴 함수 본문에서만 사용할 수 있습니다.

루틴에서 (C ++ 20)

A coroutine is a function that can suspend execution to be resumed later. Coroutines are stackless: they suspend execution by returning to the caller. This allows for sequential code that executes asynchronously (e.g. to handle non-blocking I/O without explicit callbacks), and also supports algorithms on lazy-computed infinite sequences and other uses.

Compare with other's answer:

In my opinion, the resumed later part is a core difference, just like @Twinkle's.
Although many fields of the document are still work in progress, however, this part is similar to most answer, except @Nan Xiao 's

Coroutines, on the other hand, are collaborative: at any given time, a program with coroutines is running only one of its coroutines, and this running coroutine suspends its execution only when it explicitly requests to be suspended.

Since it's quoted from Program in Lua, maybe it's language related(not familiar with Lua currently), not all document mentioned the only one part.

The relation with concurrent:
There is an "Execution" part of the Coroutines (C++20).Too long to quote here.
Besides the detail, there are several states.

When a coroutine begins execution  
When a coroutine reaches a suspension point  
When a coroutine reaches the co_return statement  
If the coroutine ends with an uncaught exception  
When the coroutine state is destroyed either because it terminated via co_return or uncaught exception, or because it was destroyed via its handle 

as the comment from @Adam Arold under @user217714's answer. It's concurrency.
But it's different from multithreading. from std::thread

Threads allow multiple functions to execute concurrently. Threads begin execution immediately upon construction of the associated thread object (pending any OS scheduling delays), starting at the top-level function provided as a constructor argument. The return value of the top-level function is ignored and if it terminates by throwing an exception, std::terminate is called. The top-level function may communicate its return value or an exception to the caller via std::promise or by modifying shared variables (which may require synchronization, see std::mutex and std::atomic)

Since it's concurrency, it works like multithreading especially when waiting is unavoidable(from the OS perspective), that's also why it's confusing.

참고URL : https://stackoverflow.com/questions/553704/what-is-a-coroutine

반응형