Pythonの非同期IOのコルーチン:コルーチンを達成するためにasyncio使用の異なる方法

はじめに:最後の章では、ソースからの非同期からの収量への使用を導入し、そして最後にコルーチンasyncio.wait()メソッドを実装するために、レッツは、コルーチン異なる制御構造を実装し、聞かせて私たちが見て彼らは〜効果異なるそれを見
コルーチン複数の線形制御の流れを簡単にして管理ビルトインキーワード待っています。使用asyncioモジュールより複雑な構造を実現することができ、それは同時に複数のコルーチンを行うことができます。

一、asyncio.wait()

あなたはコルーチンの操作が完了するまで、複数の部分に別の操作で、実行され、ウェイト(タスク)は、ポーリングタスクに循環割り込みタスク(作業)するイベントを設定するために使用することができる、他のバックグラウンドもウェイクアップ。

import time
import asyncio
async def taskIO_1():
    print('开始运行IO任务1...')
    await asyncio.sleep(2)  # 假设该任务耗时2s
    print('IO任务1已完成,耗时2s')
    return taskIO_1.__name__
async def taskIO_2():
    print('开始运行IO任务2...')
    await asyncio.sleep(3)  # 假设该任务耗时3s
    print('IO任务2已完成,耗时3s')
    return taskIO_2.__name__
async def main(): # 调用方
    tasks = [taskIO_1(), taskIO_2()]  # 把所有任务添加到task中
    done,pending = await asyncio.wait(tasks) # 子生成器
    for r in done: # done和pending都是一个任务,所以返回结果需要逐个调用result()
        print('协程无序返回值:'+r.result())

if __name__ == '__main__':
    start = time.time()
    loop = asyncio.get_event_loop() # 创建一个事件循环对象loop
    try:
        loop.run_until_complete(main()) # 完成事件循环,直到最后一个任务结束
    finally:
        loop.close() # 结束事件循环
    print('所有IO任务总耗时%.5f秒' % float(time.time()-start))

次のように実行結果は以下のとおりです。

开始运行IO任务1...
开始运行IO任务2...
IO任务1已完成,耗时2s
IO任务2已完成,耗时3s
协程无序返回值:taskIO_2
协程无序返回值:taskIO_1
所有IO任务总耗时3.00209

[説明]:wait()を使用し、公式ドキュメントを次のように:

done, pending = await asyncio.wait(aws)

ここでは、保留中、タスクリストが完了したことを示して行われ、のawaitによって(保留中、行われ)、同時に渡さAWS(awaitableオブジェクト)を実行し、タプルを返すと、タスクリストが完了していないことを示しています。
注:
①のみ可能な場合、保留待ち()渡されたタイムアウトパラメータのリストを生成します。
②結果セットを返すこと)(イベントループ待ち、タスクを完了するために配置され、それは、異なるタスクの元の順序に傾向があります。

二、asyncio.gather()

あなただけ並行コレクションを実行するコルーチンの結果を心配している場合は、そのリターンのみの結果セットのawaitによってだけではなく、()の収集を使用することができ、その結果は、着信タスクの元の順序の結果セットの順序です。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import time
import asyncio
async def taskIO_1():
    print('开始运行IO任务1...')
    await asyncio.sleep(3)  # 假设该任务耗时3s
    print('IO任务1已完成,耗时3s')
    return taskIO_1.__name__
async def taskIO_2():
    print('开始运行IO任务2...')
    await asyncio.sleep(2)  # 假设该任务耗时2s
    print('IO任务2已完成,耗时2s')
    return taskIO_2.__name__
async def main(): # 调用方
    resualts = await asyncio.gather(taskIO_1(), taskIO_2()) # 子生成器
    print(resualts)

if __name__ == '__main__':
    start = time.time()
    loop = asyncio.get_event_loop() # 创建一个事件循环对象loop
    try:
        loop.run_until_complete(main()) # 完成事件循环,直到最后一个任务结束
    finally:
        loop.close() # 结束事件循环
    print('所有IO任务总耗时%.5f秒' % float(time.time()-start))

次のように実行結果は以下のとおりです。

开始运行IO任务2...
开始运行IO任务1...
IO任务2已完成,耗时2s
IO任务1已完成,耗时3s
['taskIO_1', 'taskIO_2']
所有IO任务总耗时3.00184

[説明]:(ギャザー)のawaitリストによって直接設定結果を返し、タスク2が最初に完了しているが、我々は明らかに、結果から見ることができるが、最終的な結果セットを返すため、着信タスクの最初の順序で列。

三、asyncio.as_completed()

as_completed(タスク)を実行するコルーチンリストを(ここでは、着信タスクがある)を管理発電機です。タスク内のタスクセットリードが終了すると、結果がキーワードを待つ返すために最初のミッションとなります。目に見えるため、結果待ちを返す()、などのタスクを完了するために配列されています。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import time
import asyncio
async def taskIO_1():
    print('开始运行IO任务1...')
    await asyncio.sleep(3)  # 假设该任务耗时3s
    print('IO任务1已完成,耗时3s')
    return taskIO_1.__name__
async def taskIO_2():
    print('开始运行IO任务2...')
    await asyncio.sleep(2)  # 假设该任务耗时2s
    print('IO任务2已完成,耗时2s')
    return taskIO_2.__name__
async def main(): # 调用方
    tasks = [taskIO_1(), taskIO_2()]  # 把所有任务添加到task中
    for completed_task in asyncio.as_completed(tasks):
        resualt = await completed_task # 子生成器
        print('协程无序返回值:'+resualt)

if __name__ == '__main__':
    start = time.time()
    loop = asyncio.get_event_loop() # 创建一个事件循环对象loop
    try:
        loop.run_until_complete(main()) # 完成事件循环,直到最后一个任务结束
    finally:
        loop.close() # 结束事件循环
    print('所有IO任务总耗时%.5f秒' % float(time.time()-start))

次のように実行結果は以下のとおりです。

开始运行IO任务2...
开始运行IO任务1...
IO任务2已完成,耗时2s
协程无序返回值:taskIO_2
IO任务1已完成,耗时3s
协程无序返回值:taskIO_1
所有IO任务总耗时3.00300

[説明]:as_completed(タスク)を使用して上記の手順から見た、及び()を収集するためのコルーチンを完了するための共通の配列戻り結果、のウェイト(タスク)は正反対であることができます。違いはas_completed(タスク)は、現在のリアルタイムの結果を完了するために返すことができるということで、ウェイト(タスク)は、すべての最後の結果を得るためにコルーチン後に返すために行わ待つこと。

IVの概要

AWSは、以下を参照してください。awaitableオブジェクトを。オブジェクトのコレクションを待つために、そのようなコルーチンはコルーチンを複数含むオブジェクトリストを待っているようAWSです。

asyncio 主なパラメータの受け渡し 戻り値のシーケンス 戻り値の型を待ちます 関数戻り値の型
待つ() AWS コルーチン完全な配列 2つのタプルのタスクリストで(保留中、完了) コルーチン
as_completed() AWS コルーチン完全な配列 元の値を返します。 イテレータ
ギャザー() * AWS タスクの順序を渡すパラメータ 値のリストを返します。 awaitable
公開された706元の記事 ウォンの賞賛824 ビュー129万+

おすすめ

転載: blog.csdn.net/sinat_38682860/article/details/105055695
おすすめ