Rumah > pembangunan bahagian belakang > Tutorial Python > Apakah kaedah pelaksanaan coroutine Python?

Apakah kaedah pelaksanaan coroutine Python?

WBOY
Lepaskan: 2023-04-23 10:22:06
ke hadapan
1783 orang telah melayarinya

1. Coroutine

Coroutine tidak disediakan oleh komputer hanya menyediakan: proses dan rangkaian. Coroutine ialah proses mikro yang dicipta secara buatan untuk penukaran mod pengguna, menggunakan satu benang untuk bertukar-tukar antara berbilang proses

Beberapa cara untuk melaksanakan coroutine

  • greenlet : Modul awal

  • kata kunci hasil: boleh simpan kod, simpan keadaan

  • asyncio decorator (3.4)

  • async, tunggu kata kunci (3.5) [Disyorkan]

1.1greenlet melaksanakan coroutine

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
Salin selepas log masuk

1.2hasil kata kunci melaksanakan coroutine

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
Salin selepas log masuk

1.>

1. Gunakan modul asyncio untuk melaksanakan coroutine

Ia hanya boleh digunakan selepas versi python3.4 (tidak perlu dipasang, ia berada dalam perpustakaan standard)
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())
Salin selepas log masuk

1.4async & tunggu kata kunci melaksanakan coroutine
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)
Salin selepas log masuk

2. Maksud Coroutine

Sekiranya benang menghadapi masa menunggu IO, benang tidak akan menunggu dengan bodoh, tetapi akan menggunakan masa terbiar untuk Melakukan perkara lain, iaitu, proses itu dilaksanakan secara tak segerak.
#协程请求资源使用第三方库aiohttp
import aiohttp
Salin selepas log masuk

3. Pengaturcaraan tak segerak

3.1 Gelung masa

difahami sebagai gelung tak terhingga untuk mengesan dan melaksanakan kod tertentu
#伪代码
任务列表 = [task1,task2...]
while True:
  for 就绪任务 in 可执行任务列表:
    执行
  for 已完成任务 in 已完成任务列表:
    从任务列表中删除

import asyncio 

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

3.2 Kes

Fungsi Coroutine

,

Apabila mentakrifkan fungsi, gunakan nama fungsi async def

Objek Coroutine: Apabila melaksanakan fungsi coroutine Dapatkan objek coroutine
async def func():
  pass
result = func()
Salin selepas log masuk

Nota: Untuk objek coroutine yang diperoleh semasa melaksanakan fungsi coroutine, kod di dalam fungsi tidak akan dilaksanakan
import asyncio
async def func():
  print("哈喽")

f = func()#协程对象

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

#python3.7可以直接
asyncio.run(f)
Salin selepas log masuk

3.3menunggu kata kunci

menunggu + objek yang boleh ditunggu {coroutine objects, Future objects, Task objects} (serupa dengan I O waiting)
import asyncio
async def func():
  print("哈喽")
  re = await asyncio.sleep(2)
	print(re)
asyncio.run(func())
Salin selepas log masuk

menunggu ialah menunggu nilai objek mendapat keputusan sebelum meneruskan pelaksanaan
import asyncio
async def other():
  print("start")
  await asyncio.sleep(2)
  print("end")
  return 1

async def fun():
  print("执行协程函数内部代码")
  #遇到IO操作时会挂起当前协程任务,等IO操作完成后再继续往下执行,当前协程挂起时,时间循环对象可以执行其他协程任务
  re = await other()
  print("IO请求结束,结果为:",re)
  
asyncio.run(func())
Salin selepas log masuk

Hasil pelaksanaan


Laksanakan kod dalaman fungsi coroutine
mula
tamat

Permintaan IO tamat, hasilnya ialah: 1

Atas ialah kandungan terperinci Apakah kaedah pelaksanaan coroutine Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan