Pythonコルーチンの実装方法にはどのようなものがあるのでしょうか?

WBOY
リリース: 2023-04-23 10:22:06
転載
1748 人が閲覧しました

1. コルーチン

コルーチンはコンピューターによって提供されるのではなく、コンピューターはプロセスとスレッドのみを提供します。コルーチンは、ユーザー モードを切り替えるために人工的に作成されたマイクロプロセスであり、1 つのスレッドを使用して複数のプロセス間を行き来します

コルーチンを実装するいくつかの方法

  • greenlet : 初期module

  • #yield キーワード: コードを保存、状態を保存できる

  • #asyncio デコレータ (3.4)
  • async, await キーワード (3.5) [推奨]
  • 1.1greenlet は 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
ログイン後にコピー

1.2yield キーワードは 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
ログイン後にコピー

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 & await コルーチンを実装するためのキーワード Cheng

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. コルーチンの意味

スレッドが 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関数名を使用

コルーチンオブジェクト: コルーチン関数実行時にコルーチンを取得 Object

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 キーワード

await waitable object{ コルーチン オブジェクト、Future オブジェクト、Task object} (I O 待機と同様)

import asyncio
async def func():
  print("哈喽")
  re = await asyncio.sleep(2)
	print(re)
asyncio.run(func())
ログイン後にコピー

await は、下向きの実行を続ける前に、オブジェクトの値が結果を取得するのを待ちます。

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())
ログイン後にコピー

実行結果

コルーチン関数の内部コードを実行します
start

end
IOリクエストが終了し、結果は次のようになります: 1

以上がPythonコルーチンの実装方法にはどのようなものがあるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート