Pythonコルーチンは非同期を実現します

今日のトピック:Pythonがコールバック関数を使用して非同期処理を実装する方法を共有しました。今日は、コルーチンが非同期処理を実装する方法を説明する簡単な例を使用します。

 

コルーチンの概念

マイクロスレッドとも呼ばれるコルーチンは、ユーザーモードの軽量スレッドです。コルーチンは、最後の呼び出しの状態を保持できます。プロセスに再度入るたびに、最後の呼び出しの状態に入るのと同じです。つまり、最後に離れたとき、あるときにロジックフローの位置を入力します。プログラム内の多数のエラーCPU操作(IO)が必要な場合、コルーチンに適しています。

 

コルーチンの利点

コルーチンは、サブプログラムの切り替えがスレッドの切り替えではなく、プログラム自体によって制御されるため、実行効率が非常に高く、スレッドの切り替えのオーバーヘッドがありません。

スレッドが1つしかないため、マルチスレッドロックメカニズムは不要で、同時に変数の書き込みの競合も発生しません。コルーチンでは、共有リソースはロックせずに制御され、状態のみが判断されます。したがって、実行効率はマルチスレッドよりもはるかに高くなります。

コルーチンはスレッドによって実行されるため、マルチコアCPUを使用する最も簡単な方法は、マルチプロセス+コルーチンです。これは、マルチコアを最大限に活用するだけでなく、コルーチンの高効率を最大限に活用します。 。

 

コルーチンを形成する条件

  • 並行性は、単一のスレッドでのみ実装する必要があります

  • ロックせずに共有データを変更する

  • 複数の制御フローコンテキストスタックをユーザープログラムに保存します

  • コルーチンは、IO操作が発生すると、自動的に他のコルーチンに切り替わります。

     

     

Pythonはコルーチンを使用して非同期を実現します

import threading
import time
import datetime

#第一个请求
def request_1():
    print("the request 1 is start")
    data=yield io()#定义一个协程处理
    print("the response of callback is:",data)
    print("the request 1 is end")

#第二个请求
def request_2():
    print("the request 2 is start")
    time.sleep(2)#定义耗时2s
    print("the request 2 is end")

#获取数据请求类的操作,如:从db读取数据,循环耗时,调用其他api等
def io():
    def run():
        print("the run is start")
        time.sleep(5)#定义耗时5s
        print("the run is end")
        conn_db=[x for x in range(10000)]#模拟从db获取数据
        try:
            global gen
            gen.send(conn_db)#线程结束时发送数据给request_1函数里面的data=yeild io(),此时request_1被唤醒继续处理
        exceptStopIterationas e:
            print(e)
# 这里是启动一个线程去处理这个io操作,不用阻塞程序的处理,即不影响requst_2的继续处理
        threading.Thread(target=run,).start()

if __name__ =='__main__':
    start_time=datetime.datetime.now()
    global gen
    gen=request_1()#函数的赋值操作,生成一个生成器
    next(gen)#调用next函数,预激协程,执行了request_1()函数,如果io被挂起,就直接执行        request_2()
    request_2()
    end_time=datetime.datetime.now()
#这里是在统计总耗时,从打印的结果可以看到是异步处理的。
    print("the spend of total time is:",(end_time-start_time).seconds)

プログラム実行後の出力は次のとおりです。

the request 1is start
the run is start
the request 2is start
the request 2is end
the spend of total time is:2
the run is end
the response of callback is:[0,1,...9999]
the request 1is end

[The Way of Infinite Testing]パブリックアカウントへの注目、[リソースの受信]への返信、
Pythonプログラミング学習リソースの乾物、
Python + AppiumフレームワークAPPUI自動化、
Python + Seleniumフレームワーク
WebUI自動化、Python + UnittestフレームワークAPIへようこそオートメーション、

リソースとコードは無料で送信されます〜
記事の下部に公式アカウントのQRコードがあります。WeChatでスキャンしてフォローするだけです。

備考:私の個人公開アカウントが正式に開設され、ビッグデータテスト、機能テスト、テスト開発、APIインターフェイスの自動化、テストの運用と保守、UI自動化テストなどのテストテクノロジーの共有に専念しています。WeChat検索パブリックアカウント:「WuliangThe Way of Testing」、または以下のQRコードをスキャンしてください。

 注意を向けて、一緒に成長しましょう!

おすすめ

転載: blog.csdn.net/weixin_41754309/article/details/110201768