ホームページ > バックエンド開発 > Python チュートリアル > Python 非同期モジュールの使用方法

Python 非同期モジュールの使用方法

PHPz
リリース: 2023-05-30 23:43:35
転載
2169 人が閲覧しました

コルーチンはマイクロスレッドとしても知られ、ユーザー モードでコンテキストを切り替えるためのテクノロジです。つまり、これは実際には、実行間を切り替えるコード ブロックを実装するスレッドです。

Python のコルーチンのサポートは、ジェネレーターを通じて実装されます。

ジェネレーターでは、for ループを反復処理するだけでなく、next() 関数を継続的に呼び出して、yield ステートメントによって返される次の値を取得することもできます。 Python の yield は、値を返すために使用できるだけでなく、呼び出し元によって渡されたパラメーターを受け取ることもできます。

1. ジェネレーターとは

Pythonのジェネレーターと呼ばれる仕組みは、ループしながら計算を行います。アルゴリズムを指定し、呼び出し中に真の値を計算します。

ジェネレーターから値を取得する必要がある場合は、next() を使用できますが、通常は for ループを使用して値を取得します。

generator 実装ジェネレーター、() を使用して

を表します。例: [1, 2, 3, 4, 5]、ジェネレーター メソッド:

data = [1, 2, 3, 4, 5]
(x * x for x in len(data))
ログイン後にコピー

関数定義複雑なロジックを含むシナリオでは、最初の方法を使用するのは適切ではないため、次のような型関数を定義する方法があります。

def num(x):
    while (x < 10):
        print(x * x)
        x += 1
g = num(1)
for item in g:
    print(item)
ログイン後にコピー

関数内に yield が出現すると、generator

def num(x):
    while (x < 10):
        yield x * x  # 返回结果,下次从这个地方继续?
        x += 1
g = num(1)  # 返回的是generator对象
for item in g:
    print(item)
ログイン後にコピー
になります。

はジェネレータ関数となり、next() が呼び出されるたびに実行され、yield 文に遭遇すると戻り、再度実行されると、最後に返された yield 文から実行が継続されます。

2. asyncio を使用して非同期 io を実装する

非同期 io はイベント ループとコルーチン関数を通じて実装されます

イベント ループは内部タスクを継続的に監視し、存在する場合は実行します。タスク 実行可能タスクと実行中タスクに分けられ、イベント ループによって処理タスクが決定され、タスク リストが空の場合、イベントは終了します。

import asyncio
# 生成或获取事件循环对象loop;类比Java的Netty,我理解为开启一个selector
loop = asyncio.get_event_loop()  
# 将协程函数(任务)提交到事件循环的任务列表中,协程函数执行完成之后终止。
# run_until_complete 会检查协程函数的运行状态,并执行协程函数
loop.run_until_complete( func() )
ログイン後にコピー

テストデモ

import asyncio
import time
async def test():
    print("io等待")
    await asyncio.sleep(1)
    return &#39;hello&#39;
async def hello():
    print("Hello world")
    r = await test()
    print("hello again")
loop = asyncio.get_event_loop()
tasks = [hello(), hello()]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
ログイン後にコピー

Python 非同期モジュールの使用方法

コルーチン関数: async def によって変更された関数; def func() などの通常の def と比較して、次のことができます。関数によって返された値は直接受信されますが、コルーチン関数の場合はコルーチン オブジェクトが返されます。

コルーチン関数を実行したい場合は、このオブジェクトをイベント ループに渡して処理する必要があります。

# 测试协程
import asyncio
import time, datetime
# 异步函数不同于普通函数,调用普通函数会得到返回值
# 而调用异步函数会得到一个协程对象。我们需要将协程对象放到一个事件循环中才能达到与其他协程对象协作的效果
# 因为事件循环会负责处理子程 序切换的操作。
async def Print():
    return "hello"
loop = asyncio.get_event_loop()
loop.run_until_complete(Print)
ログイン後にコピー

await:

使用法: response = await 待機可能オブジェクト

待機可能オブジェクト: コルーチン オブジェクト、Future、Task オブジェクトは IO 待機として理解できます。

response: await の結果は、IO 操作が発生したときに現在のコルーチン (タスク) を一時停止します。現在のコルーチンが一時停止されると、イベント ループは他のコルーチン (タスク) を実行できます。注: Can wait Ifオブジェクトがコルーチン オブジェクトの場合はシリアルになり、Task オブジェクトの場合は Task オブジェクトが同時に実行され、イベント ループ リストに複数のタスクを追加できます。 「asyncio.create_task()」を使用して「Task」オブジェクトを作成できます。渡されるパラメータはコルーチン オブジェクトです。

import asyncio
import time, datetime
async def display(num):
    pass
tasks = []
for num in range(10):
    tasks.append(display(num))  # 生成任务列表
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
ログイン後にコピー

asnyc と await は新しい構文で、古いバージョンは次のとおりです: @asyncio.coroutine およびyield from

3. aiohttp

asyncio は、シングルスレッドの同時 IO 操作を実装できます。クライアント側でのみ使用される場合、あまり強力ではありません。 asyncio が Web サーバーなどのサーバー側で使用される場合、HTTP 接続は IO 操作であるため、シングルスレッドのコルーチンを使用して複数のユーザーに対する高い同時実行性のサポートを実現できます。

aiohttp は、asyncio に基づく HTTP フレームワークです。

requests get request のようにリクエストを送信できます。

params パラメータで渡すパラメータを指定できます。

async def fetch(session):
    async with session.get("http://localhost:10056/test/") as response:
        data = json.loads(await response.text())
        print(data["data"])
ログイン後にコピー

post request

  • 2 つのタスクを非同期に実行する

  • #ネットワーク リクエストでは、リクエストはセッションであり、aiohttp は ClientSession を使用してセッションを管理します

  • # # session.method を使用してリクエストを送信します
  • 応答情報応答の場合、status を使用して応答ステータス コードを取得し、text() を使用して応答内容を取得します。 text()のエンコード形式。応答結果を待つ前に、response.text() の前に await キーワード
  • async def init(num):
        async with aiohttp.ClientSession() as session:
            if num == 1:
                time.sleep(5)
            print("session begin", num)
            async with session.post("http://localhost:10056/hello/", data=json.dumps({"data": "hello"})) as response:
                print("client begin", num)
                data = json.loads(await response.text())
    
                print(data["data"])
            print("session end", num)
        print("other")
    if __name__ == &#39;__main__&#39;:
        loop = asyncio.get_event_loop()
        tasks = [init(1), init(2)]
        loop.run_until_complete(asyncio.wait(tasks))
    ログイン後にコピー

    を追加する必要があります。

    以上がPython 非同期モジュールの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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