コルーチンはマイクロスレッドとしても知られ、ユーザー モードでコンテキストを切り替えるためのテクノロジです。つまり、これは実際には、実行間を切り替えるコード ブロックを実装するスレッドです。
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 'hello' 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()
コルーチン関数: 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__ == '__main__': loop = asyncio.get_event_loop() tasks = [init(1), init(2)] loop.run_until_complete(asyncio.wait(tasks))
を追加する必要があります。
以上がPython 非同期モジュールの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Pythonは、データサイエンス、Web開発、自動化タスクに適していますが、Cはシステムプログラミング、ゲーム開発、組み込みシステムに適しています。 Pythonは、そのシンプルさと強力なエコシステムで知られていますが、Cは高性能および基礎となる制御機能で知られています。

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

2時間以内にPythonの基本を学ぶことができます。 1。変数とデータ型を学習します。2。ステートメントやループの場合などのマスター制御構造、3。関数の定義と使用を理解します。これらは、簡単なPythonプログラムの作成を開始するのに役立ちます。

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

Python 3.6のピクルスファイルのロードレポートエラー:modulenotFounderror:nomodulenamed ...

風光明媚なスポットコメント分析におけるJieba Wordセグメンテーションの問題を解決する方法は?風光明媚なスポットコメントと分析を行っているとき、私たちはしばしばJieba Wordセグメンテーションツールを使用してテキストを処理します...


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

メモ帳++7.3.1
使いやすく無料のコードエディター

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター
