>백엔드 개발 >파이썬 튜토리얼 >Python의 코루틴에 대한 자세한 설명

Python의 코루틴에 대한 자세한 설명

王林
王林원래의
2023-06-10 11:37:464518검색

Python은 단순성, 학습 용이성 및 광범위한 응용 프로그램으로 인해 널리 사용되는 인기 있는 프로그래밍 언어입니다. 그 중 코루틴은 Python에서 매우 중요한 개념이자 Python의 비동기 IO 프로그래밍의 기초 중 하나입니다. 이 글에서는 Python의 코루틴에 대해 자세히 설명합니다.

1. 코루틴이란 무엇입니까? 코루틴은 운영 체제 스레드보다 이식성이 뛰어난 사용자 모드 경량 스레드입니다. 프로그램 내에서 프로그래머가 구현하므로 컨텍스트 전환에 따른 오버헤드가 없으며, 외부 개입 없이 프로그램 자체에서 코루틴 전환이 완료되어 스레드 생성을 줄이고 CPU 리소스를 보다 효율적으로 사용할 수 있습니다.

코루틴의 특징:

동일한 스레드에서 동시에 실행될 수 있으며 전환 오버헤드가 매우 작아서 높은 동시성을 지원합니다.
  1. 코루틴의 상태는 프로그래머가 직접 관리하므로 스레드보다 가볍습니다.
  2. 2. 코루틴 구현

파이썬에서 코루틴을 구현하는 방법에는 생성기, async/await 및 gevent와 결합하는 세 가지 방법이 있습니다. 아래에서 하나씩 소개하겠습니다.

Generator
  1. Python의 생성기 자체에는 상태 저장 및 복원 기능이 있어 코루틴 구현에 매우 적합합니다. 제너레이터 코루틴의 가장 큰 특징은 Yield 문을 사용하여 함수를 일시 중지하고 함수 상태를 저장하는 것입니다.

다음은 코루틴의 예입니다.

def simple_coroutine():
    print('-> coroutine started')
    x = yield
    print('-> coroutine received:', x)

# 调用协程
my_coroutine = simple_coroutine()
print(my_coroutine)  # <generator object simple_coroutine at 0x7f6b25c43eb0>

# 先启动协程,让协程处于暂停状态。
next(my_coroutine)  # -> coroutine started

# 发送消息给协程,它会恢复执行,并打印出消息
my_coroutine.send('hello world')  # -> coroutine received: hello world

이 예에서 simple_coroutine 함수에는 생성기 코루틴의 기호인 항복 표현식이 포함되어 있습니다. 함수가 호출되면 생성기 개체가 반환됩니다. 프로그램은 next() 메서드를 호출하여 생성기를 첫 번째 항복 문으로 진행하고 "-> 코루틴 시작됨"이라는 메시지를 인쇄합니다. 그런 다음 "hello world" 메시지를 생성기에 보냈고, 이 메시지는 변수 x에 캡처되어 "-> coroutine received: hello world"로 인쇄되었습니다.

async/await
  1. Python 3.5 이후 Python은 코루틴 구문 async/await에 대한 기본 지원을 제공합니다. 더 깔끔한 구문과 더 나은 가독성을 제공합니다.

다음은 async/await의 예입니다.

import asyncio

async def countdown(n):
    while n > 0:
        print(f'T-minus {n}')
        await asyncio.sleep(1.0)
        n -= 1

asyncio.run(countdown(3))

이 예에서 async/await를 사용하면 함수에서 async 키워드를 사용하여 코루틴을 정의하고 Wait를 사용하여 코루틴을 일시 중단할 수 있습니다. 물론 async/await 구문을 사용하려면 asyncio 라이브러리를 사용해야 합니다.

gevent와 함께 사용
  1. gevent는 코루틴을 기반으로 하는 Python 네트워크 라이브러리로, 프로그래머가 쉽게 작성하고 테스트할 수 있는 비동기식 비차단 코드를 작성할 수 있는 수율 기반 프로그래밍 모델을 제공합니다. gevent를 사용하려면 먼저 pip를 통해 설치해야 합니다.

다음은 gevent를 사용하는 예입니다.

import gevent

def task(pid):
    """
    函数中的sleep模拟阻塞一段时间,通过gevent中的异步框架进行并发。
    """
    gevent.sleep(0.5)
    print(f'Task {pid} done')

def synchronous():
    """
    任务同步执行
    """
    for i in range(1, 10):
        task(i)

def asynchronous():
    """
    任务异步执行
    """
    threads = [gevent.spawn(task, i) for i in range(10)]
    gevent.joinall(threads)

print('Synchronous:')
synchronous()

print('Asynchronous:')
asynchronous()

이 예에서는 gevent 프레임워크를 사용하여 비동기 코루틴을 구현합니다. 이 예를 통해 비동기 실행 중에 코루틴의 비동기 특성을 활용하여 작업이 교대로 수행되는 것을 명확하게 볼 수 있습니다. 동기 실행 중에는 작업이 하나씩 실행되는 것을 볼 수 있습니다.

3. 코루틴의 장점과 단점

장점:

코루틴은 기본적으로 단일 스레드이므로 다중 스레드 전환으로 인한 오버헤드를 방지하고 프로그램 실행 속도를 향상시킵니다.
  1. 코루틴은 다중 프로세스 GIL(Global Interpreter Lock) 문제를 방지하고 프로그램 효율성을 향상시킬 수 있습니다.
  2. 코루틴은 무제한으로 생성할 수 있지만 스레드와 프로세스의 수는 제한되어 있지만 너무 많은 코루틴을 열면 성능 문제가 발생할 수도 있습니다.
  3. 단점:

코루틴은 특별하며 프로그래머가 프로그램의 실행 상태를 수동으로 제어해야 하며 복잡성이 상대적으로 높고 더 많은 노력이 필요합니다.
  1. 코루틴 코드 자체에는 오류 처리 메커니즘이 없으므로 예외 처리 및 코드 디버깅이 더 어렵습니다.
  2. 4. 요약

이 글에서는 Python에서 코루틴의 개념과 구현 방법, 장단점을 자세히 소개합니다. 코루틴은 Python에서 매우 중요한 개념이며 비동기 IO 프로그래밍의 기초 중 하나입니다. 코루틴을 통해 동일한 스레드에서 비즈니스를 동시에 실행하고, 프로그램 실행 효율성을 향상하고, 많은 컨텍스트 전환 오버헤드를 방지하고, 시스템 리소스를 크게 절약할 수 있습니다. 그러나 코루틴에는 프로그래머에게 높은 프로그래밍 기술이 필요하고 불완전한 오류 처리 메커니즘이 필요한 등 몇 가지 단점도 있습니다. 이러한 문제는 프로그래머가 코루틴을 사용할 때 주의를 기울여야 합니다.

위 내용은 Python의 코루틴에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.