>  기사  >  백엔드 개발  >  Python 코루틴의 구현 방법은 무엇입니까?

Python 코루틴의 구현 방법은 무엇입니까?

WBOY
WBOY앞으로
2023-04-23 10:22:061713검색

1. 코루틴

코루틴은 컴퓨터에서 제공하지 않습니다. 컴퓨터는 프로세스와 스레드만 제공합니다. 코루틴은 사용자 모드 전환을 위해 인위적으로 생성된 마이크로 프로세스로, 하나의 스레드를 사용하여 여러 프로세스 간을 앞뒤로 전환합니다.

코루틴을 구현하는 여러 가지 방법

  • greenlet: 초기 모듈

  • yield 키워드: 예 코드 저장, 상태 저장

  • asyncio 데코레이터(3.4)

  • async, 키워드 대기(3.5) [권장]

1.1greenlet은 코루틴을 구현합니다

pip install greenlet

from greenlet import greenlet
def fun1():
  gre2.switch()#切换到fun2
  pass
def fun2():
  gre1.switch()#切换到fun1
  pass
gre1 = greenlet(func1)
gre2 = greenlet(func2)
gre1.switch()#先去执行fun1

1.2yield 키워드는 코루틴을 구현합니다

def func1():
    yield 1
    yield from func2()
    yield 2
    
def func2():
    yield 3
    yield 4
f1 = func1()
for item in f1:
    print(item,end=" ")
    
#打印结果
1 3 4 2

1.3 asyncio 모듈을 사용하여 코루틴 구현

python3.4 버전 이후에만 사용할 수 있습니다(설치할 필요 없음, 표준 라이브러리에 있음)

import asyncio
#使用该装饰器装饰后,该函数就是一个协程函数
@asyncio.coroutine
def func1():
    print(1)
    #遇到IO操作时,会自动切换到taks中的其他任务函数
    yield from asyncio.sleep(2)
    print(2)

@asyncio.coroutine
def func2():
    print(3)
    yield from asyncio.sleep(2)
    print(4)
    
#将两个协程函数封装成一个tasks列表
tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]
#
loop = asyncio.get_event_loop()
loop.run_until_complete(func1())

1.4async 및 코루틴 구현을 위한 대기 키워드

import asyncio
#使用该装饰器装饰后,该函数就是一个协程函数

async def func1():
    print(1)
    #遇到IO操作时,会自动切换到tasks中的其他任务函数
    await asyncio.sleep(2)
    print(2)


async def func2():
    print(3)
    await asyncio.sleep(2)
    print(4)
    
#将两个协程函数封装成一个tasks列表
tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]

loop = asyncio.get_event_loop()
loop.run_until_complete(tasks)

2 코루틴의 의미

If 스레드가 IO 대기 시간에 직면하면 스레드는 어리석게 기다리지 않고 유휴 시간을 사용하여 다른 작업을 수행합니다. 즉, 프로세스가 비동기적으로 실행됩니다.

#协程请求资源使用第三方库aiohttp
import aiohttp

3. 비동기 프로그래밍

3.1 타임 루프

특정 코드를 감지하고 실행하는 무한 루프로 이해

#伪代码
任务列表 = [task1,task2...]
while True:
  for 就绪任务 in 可执行任务列表:
    执行
  for 已完成任务 in 已完成任务列表:
    从任务列表中删除

import asyncio 

#生成一个书简循环
loop = asyncio.get_event_loop()
#将任务放到任务列表中
loop.run_until_complete(任务)

3.2 사례

코루틴 함수,

함수를 정의할 때 async def 함수 이름을 사용하세요

코루틴 객체: 코루틴 함수 실행 시 코루틴 객체를 획득합니다

async def func():
  pass
result = func()

참고: 코루틴 함수 실행 시 획득한 코루틴 객체의 경우 함수 내부의 코드는 실행되지 않습니다

import asyncio
async def func():
  print("哈喽")

f = func()#协程对象

loop = asyncio.get_event_loop()#创建循环对象
loop.run_until_complete(f)#通过循环对象执行协程对象

#python3.7可以直接
asyncio.run(f)

3.3await 키워드

wait + Waitable 객체 {Coroutine 객체, Future 객체, Task 객체} (IO 대기와 유사)

import asyncio
async def func():
  print("哈喽")
  re = await asyncio.sleep(2)
	print(re)
asyncio.run(func())

await는 실행 결과를 계속 실행하기 전에 객체의 값이 결과를 얻을 때까지 기다리는 것입니다

실행 코루틴 내부 코드 프로세스 함수
start

end
IO 요청이 종료되고 결과는 1

입니다.

위 내용은 Python 코루틴의 구현 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제