Python3のルーチンについて学ぶ

バックグラウンド##

Python3は長い間発売されており、日常の機能について学ぶ時間がありませんでした。今回は公式ドキュメントに従ってそれについて学びます。

Pythonバージョン:3.6.6

Hello World

import asyncio

async def hello_world():print("Hello World!")

loop = asyncio.get_event_loop()
loop.run_until_complete(hello_world())
loop.close()

実際には、関数の通常の実行と大きな違いはありません。

公式の紹介によると、ここでのルーチンはタスクを介して行われるため、ここで「ループ」を定義する必要があります。この「ループ」は、着信関数の実行ステータスを監視します。実行が完了したら、 loopをオフにします。

実際、 Python3.8asyncio.run()に変更されました。このメソッドは実際にはよりユーザーフレンドリーであり、基本的にはコルティンの実装方法を認識しません。

非同期の結果を取得します##

import asyncio

async def slow_operation(future):await asyncio.sleep(1)
 future.set_result('Future is done!')

loop = asyncio.get_event_loop()
future = asyncio.Future()
asyncio.ensure_future(slow_operation(future))
loop.run_until_complete(future)print(future.result())
loop.close()

ご覧のとおり、これは実際には Futureを定義することで実現されます。非同期関数が実行された後、結果は set_resultメソッドによって設定されます。この結果は外層で得ることができます。このようにして、同期的な考え方で非同期プログラムを作成し、返された結果を取得できます。

折り返し電話##

import asyncio

async def slow_operation():await asyncio.sleep(1)return'Future is done!'

def got_result(future):print(future.result())

loop = asyncio.get_event_loop()
task = asyncio.ensure_future(slow_operation())
task.add_done_callback(got_result)
loop.run_until_complete(task)
loop.close()

ここでの例は、私が公式の例で変更したもので、理解しやすいです。ここでのコールバックは Futureオブジェクトにスローされます。このオブジェクトのメソッドを介して結果を取得します。

マルチタスク##

import asyncio
import time

async def factorial(name, number):
 f =1for i inrange(2, number+1):print("Task %s: Compute factorial(%s)..."%(name, i))await asyncio.sleep(1)
  f *= i
 print("Task %s: factorial(%s) = %s"%(name, number, f))

loop = asyncio.get_event_loop()print(time.time())
loop.run_until_complete(asyncio.gather(factorial("A",2),factorial("B",2),factorial("C",2),))print(time.time())
loop.close()

ここでは「gather」メソッドを紹介します。この同形性の方法は、同時に複数のタスクを実行できます。

上記のコードの公式コンテンツを変更しました。実行結果を見ることができます。これらの3つのタスクは、実際には同時に実行されます。関数の実行時間全体はわずか1秒です。それは並行性を達成することです。

公式ドキュメントの例は、実際には、ループがすべてのタスクが完了するのを待ってから終了することを示しています。

A task is automatically scheduled for execution when it is created. The event loop stops when all tasks are done.

いくつかの小さな詳細##

このコンテンツを読みながら、 time.sleep(1)await asyncio.sleep(1)の違いを考えていました。

awaitを使用すると、この部分に遭遇したときにコルチンがコンテキストを切り替えます。awaitを使用しない場合、常にブロックされます。これは、待機が実用的でない場合を意味します。 。 。並行性は誤った提案です。

上記のマルチタスク実行例では、 await asyncio.sleep(1)time.sleep(1)に変更します。これらの3つのタスクは連続していることがわかります。

参照##

https://hackernoon.com/threaded-asynchronous-magic-and-how-to-wield-it-bba9ed602c32

https://docs.python.org/zh-cn/3.6/library/asyncio-task.html

Recommended Posts

Python3のルーチンについて学ぶ
Pythonの日常について話す
Pythonでのガベージコレクションについて学ぶ
Pythonの初心者はデコレータを学びます
Python機能プログラミングについて話す
Pythonでの継承について話す
Pythonで文字列について話す
Pythonのモジュールについて話す
Excelを比較し、Pythonウィンドウ関数を学ぶ
pythonクローラーは簡単に習得できますか
pythonインタラクティブモードの基本を学ぶ
プログラミングの基礎なしでpythonを学ぶことはできますか
1分でPythonを学ぶ|オブジェクト指向(中国語)
Pythonの解凍に関する知識ポイントの要約
1分でPythonを学ぶ| Python関数(オン)
Pythonタイムモジュールを学ぶ方法
Pythonマルチスレッドとプログラムロックについて話す