同期性管理(3)-coルーチンとは?


入る前に。


この授業ではcoluceneの概念を理解してみましょう.
  • プロセスとスレッド概念
  • Python GIL(Global Interpreter Lock)
  • コードルーチン
  • 同期管理を実施するためのモジュール例(Futures,Asyncio)
  •                            [이 글은 Python 언어 기반으로 작성되었습니다.]

    Pythonの同期管理に必要な内容を理解する


    同期管理の説明を開始する前に、基本的な知識を理解する必要があります.
    ざっと3種類紹介!3つのケースがあります.
  • プロセスとスレッド概念
  • Python GIL(Global Interpreter Lock)
  • コードルーチン
  • 三つの概念におけるサブプログラム(Coルーチン)を理解する.

    同時性と同時性


    まずcoluceneを知る前に同期性と並列性を正しく理解し移行する必要があるので説明したいと思います.
    第1編の画面を覚えていますか?
    (第1編を見ていない方はpython同期管理(1)-プロセスとスレッド参照)

    上記の状況を考えて、同期性と並列性について説明しましょう.
    その前に,少なくとも1つのプロセッサ(CPU)上でプロセスを実行できると述べた.
    私のノートパソコンには8つのコアがあります.最大8つのプロセスを同時に実行することができます.
    しかし、私が8つのプロセスよりもノートパソコンで実行できる理由は、次のとおりです.
    OS(OS)は、CPUが同時に動作するのではなく、CPUが実行するプロセスを非常に高速に置き換えています.
    この場合、同時性と並列性を説明できます!
    コンカレント(Concurrency)とは、ある時点でタスクが同時に実行されず、複数のタスクが同時に実行されるようにタスクを時分割処理することを意味する.
    これに対して、並列性は、実際の時点でタスクを同時に実行し、並列に実行することを意味する.
    これは,同期性と並列性が異なる概念であることを意味する.
    例えば、前編でCPythonがGILを使用している場合、マルチスレッド実行時には、CPUの観点から、CPythonは並列ではなく同期である.
    GIL環境で並列性を適用したい場合は、複数のCPUが所定の環境で複数の処理で並列性を適用できます.
    では、同期管理は並列性を含まない概念ですか?
    実は誰もが混用しています
    同期管理は、同期と並列を意味する場合があります.
    これは、コンテキストに応じて純粋な同期(Concurrency)を意味する可能性があります.
    違いは下図でさらに直感的に理解してください.

    先に説明した同期性と並列性の理由は、次のとおりです.
    これは、将来説明するコード・インスタンスが、同時プログラミングではなく同時プログラミングをサポートする技術であるためである.
    ウィキペディアのコカインに関する説明とテーマの比較説明は以下のとおりです.
    Coroutines are very similar to threads. However, coroutines are cooperatively multitasked, whereas threads are typically preemptively multitasked. Coroutines provide concurrency but not parallelism.(スレッドは同時性をサポートするが、並列性はサポートしない)
    同時に,同時性と同時性の概念の区別も重要である.
    また、coluceneは理解していますが、上記の内容が混同される可能性があるので、先に説明したいと思います!
    では、COルーチンについて本格的に理解していきましょう

    コルディンって何?


    共通プログラムとは、共同で協力するプログラムのことです.
    相互に関連付けられたプログラムまたは関数であってもよい.
    ここで、相互協力のルーチンとは何ですか?
    この2つの関数を直感的に理解してみましょう.
    まず,2つの数を加算した関数を呼び出す主関数をコードで記述する.
    def add(a, b):
    	c = a + b
        print(c)
        print("add 함수")
    
    def calc():
    	add(1, 2) 
        print("calc 함수")
        
    calc()
    上記のコードは、calc関数でadd関数を呼び出す.add関数が完了すると、calcに戻ります.add関数が終わると、add関数の変数と計算式は消えます.
    通常、サブルーチンをメインルーチンで呼び出し、終了と呼ぶことができます.
    簡単に絵で表現すると次のような関係になります

    しかし、コルティンのやり方は少し違うと言えます.
    以上のように,メインプログラムとサブプログラムは従属関係ではなく対等関係であり,特定の時間に相手のコードを実行する.
    次のコードはcoluceneの例の1つです.
    def sum_coroutine():
        total = 0
        while True:
            x = (yield total)
            total += x
    
    
    def sum_func():
        co = sum_coroutine()
        next(co)
        result1 = co.send(10)
        print(f"result1 --> {result1}")
        result2 = co.send(20)
        print(f"result2 --> {result2}")
    
    sum_func()
    sum_funcおよびsum_coroutineのオブジェクトcoは、互いに値付けおよび伝達され、それらは協働して動作することができることがわかります.
    重要なことは、sum_coroutineは、1回の実行後に終了するのではなく、co関数を介してsendに値を伝達し続け、「待機」することである.
    △あとでcoluceneに文法などを詳しく紹介しますので、よくわからなくてもあまり心配しないでください.
    概念を明确に理解すればいい.
    図に示すように、次の関係で表すことができます.

    上記の性質から、プログラマブルプログラムは、コラボレーションマルチタスク処理の関数またはプログラムと呼ばれる.
    追加のsum_coroutineは、1回で終了するのではなく、「待機」です.
    これは、プログラマブルコードが非同期処理を可能にし、プログラマブルコードの関数を組み合わせて、同時プログラミングを実現することができることを意味する.
    デフォルトでは、あるポイントで実行を一時停止し、その後同じポイントで実行を続行できる関数です.

    スレッドとスレッドの比較


    通常、コードスレッドとスレッドを比較します.
    通常、スレッドを定義する場合、スレッドはライトレベルスレッド(light-weighted thread)とも呼ばれます.
    これは、コルディンとスレッドが同時にプログラミングできるからです.
    スレッドの同期性を保証するコストとメモリの使用はコンテキスト切替です.
    Context切替が発生しない場合にメモリの使用を減らし、同期を保証できるため、このスレッドを軽量レベルスレッドと呼ぶ.
    コードスレッドは、プログラマのコードによって同期性を保証します.
    もっと詳しく理解するために、2枚の図で理解してみましょう.
    どちらの図もTask 1、Task 2、Task 3、Task 4を実行するために使用されるスレッドとスレッドです!
    まずテーマを見てみましょう.

    Task 1はThreadaで実行され、Task 2を実行する必要がある場合には非同期でThreadbを呼び出して実行される.Threadaはブロックされ、ContextはThreadbに切り替わります.
    タスク2が完了すると、ContextはThreadaに戻り、結果をTask 1に戻す.
    同様に、Task 3、Task 4は、ThreadCおよびThreadD上で実行される.
    Taskを実行する単位はスレッドであり,コンテキスト切替により同期が確保される.
    次はcoluceneです.

    Task 1はThreadaで実行され、Task 2が必要な場合は同じThreadaで非同期で実行される.
    これは、同じスレッド上でTask 1とTask 2を実行することができ、コンテキスト切替コストを回避できることを意味します.
    Task 3とTask 4は同時にThreadC上で実行することもできる.
    (並列性ではなく同時性を表します.)
    すなわち,操作単位はスレッド単位ではなくオブジェクト単位(プログラマが決定できる単位)で実行される.
    同時性保障手段はプログラマーのコードとなる.
    これは、スレッドを使用して同期プログラミングを行うと、メモリとContextの切り替えコストがスレッドよりも低くなるため、軽量レベルのスレッドと呼ばれることを意味します.
    この授業では、同期性と並列性の概念と違い、coluceneとは何かを簡単に紹介しました.
    次のレッスンでは、Pythonでのコードの使用と実装方法について説明します.

    ブログ参照


    この記事を作成する際に参照するブログは次のとおりです.
    Co定例-ウィキペディア
    Coroutines in Python
    Pythonコードスタンプ
    Coルーチン、threadとの違いとその特徴