코루틴은 컴퓨터에서 제공하지 않습니다. 컴퓨터는 프로세스와 스레드만 제공합니다. 코루틴은 사용자 모드 전환을 위해 인위적으로 생성된 마이크로 프로세스로, 하나의 스레드를 사용하여 여러 프로세스 간을 앞뒤로 전환합니다.
코루틴을 구현하는 여러 가지 방법
greenlet: 초기 모듈
yield 키워드: 예 코드 저장, 상태 저장
asyncio 데코레이터(3.4)
async, 키워드 대기(3.5) [권장]
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
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
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())
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)
If 스레드가 IO 대기 시간에 직면하면 스레드는 어리석게 기다리지 않고 유휴 시간을 사용하여 다른 작업을 수행합니다. 즉, 프로세스가 비동기적으로 실행됩니다.
#协程请求资源使用第三方库aiohttp import aiohttp
특정 코드를 감지하고 실행하는 무한 루프로 이해
#伪代码 任务列表 = [task1,task2...] while True: for 就绪任务 in 可执行任务列表: 执行 for 已完成任务 in 已完成任务列表: 从任务列表中删除 import asyncio #生成一个书简循环 loop = asyncio.get_event_loop() #将任务放到任务列表中 loop.run_until_complete(任务)
코루틴 함수,
함수를 정의할 때 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)
wait + Waitable 객체 {Coroutine 객체, Future 객체, Task 객체} (IO 대기와 유사)
import asyncio async def func(): print("哈喽") re = await asyncio.sleep(2) print(re) asyncio.run(func())
await는 실행 결과를 계속 실행하기 전에 객체의 값이 결과를 얻을 때까지 기다리는 것입니다
실행 코루틴 내부 코드 프로세스 함수startend
IO 요청이 종료되고 결과는 1
입니다.
위 내용은 Python 코루틴의 구현 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!