123ベースコルーチン

まず、スレッド、見直しを処理

  1. オペレーティングシステムでは、プロセスは、リソース割り当ての最小単位であり、スレッドは、最小単位のCPUスケジューリングです。

  2. 同時自然:保存状態を切り替えます+。

  3. タスクを実行するCPU(強制切替がオペレーティング・システムによって制御される)の両方の場合において、カットの周りに他のタスクを実行し、閉塞がタスクを発生した場合、他のタスクは、計算時間が長すぎるということです。

  4. プロセス理論を導入、プロセスの3つの実施状況に言及し、それは図3の状態のスレッドとして理解することができるので、スレッドは、実行ユニットです。

  5. 複数のタスクは、純粋な計算ですが、このスイッチの効率を低下させるかどうちょうど雨がCPUがすべてのタスクを達成することができるように下降させるために、効率性を高めない並行は、結果の「同時」実装であるように見えます。

第二に、共同生産プロセス

コルーチン:同時シングルスレッドとも呼ばれるマイクロスレッドは、シュレッド。英語コルーチン。

何が単語記述コルーチンです:コルーチン軽量スレッドはすなわちコルーチンは、自分自身をスケジュールするユーザプログラム、同時実行単一のスレッドによって制御され、ユーザー状態です。

これは、ことが強調されます

  1. カーネル・レベルに属するPythonのスレッドが、それは、オペレーティングシステムのスケジューラによって制御される(シングルスレッド実行時間が長すぎるか遭遇などのIOは、CPUが実行権限を放棄別のスレッドの実行に切り替えることを余儀なくされるであろう)
  2. 単一スレッド内オープンコルーチン、イベント10、意志(非独立ハンドオーバ及び効率!!! IOオペレーション)は、アプリケーションレベル(よりむしろオペレーティングシステム)制御スイッチから、効率を向上させるために

比較OS制御スレッド切り替えは、ユーザが単一のスレッド内に制御コルーチンを切り替えます。

キー:それは切り替えに来たときioは理にかなっています

具体的に:コルーチン概念は、基本的にプログラマから抽象化され、オペレーティングシステムがコルーチンの存在を知らない、それは私自身の経験の彼らの他のタスクに直接カットし、私自身のスレッド内のIO、および操作のスレッドを言うだろうこのシステムは見つけることができないと、それは、単一のスレッドの下で最高の効率を達成するために、です。

長所

  1. コルーチンスイッチングオーバーヘッドは、オペレーティングシステムのより小さな、プログラムレベル切替部が完全に感知でき、従ってより軽量であります
  2. あなたは最大のシングルスレッドのCPUの同時使用の効果を得ることができます

短所

  1. 自然コルーチンは、閉塞があるたびに、あなたは、すべてのIOを検出する必要があり、マルチコアは、使用することはできませんプログラムは、よりオープンなプロセス、各プロセス内で開いた複数のスレッド、各スレッド内のオープンコルーチンかもしれシングルスレッドです全体的閉塞を行ってきました。
  2. コルーチンは、コルーチンブロッキングが発生一旦、単一のスレッドを参照していない、全くスイッチングタスク、スレッド全体をブロックします

特長

  1. それは唯一のシングルスレッドで同時に実施されなければなりません
  2. ロックすることなく共有データを変更します
  3. ユーザープログラムの制御フロースタック複数のコンテキストを保存
import time
def eat():
    print('eat 1')
    # 疯狂的计算呢没有io
    time.sleep(2)
    # for i in range(100000000):
    #     i+1
def play():
    print('play 1')
    # 疯狂的计算呢没有io
    time.sleep(3)
    # for i in range(100000000):
    #     i+1
play()
eat() # 5s

(私たちはIO理にかなっがある場合に行うにはコルーチンを言ったので)シングルスレッドでは、コルーチン歩留まりを実装するために使用することは、これはCtripの音痴ではありません

import time
def func1():
    while True:
        1000000+1
        yield

def func2():
    g = func1()
    for i in range(100000000):
        i+1
        next(g)

start = time.time()
func2()
stop = time.time()
print(stop - start) # 17.68560242652893

上記の比較は、時間を実行している切り替えるyeildが、私たちだけではよりそうCtripの上記の意味がありません達成するために、より多くの時間がかかりシリアル実行機能を取ります。

import time

def func1():
    for i in range(100000000):
        i+1
def func2():
    for i in range(100000000):
        i+1

start = time.time()
func1()
func2()
stop = time.time()
print(stop - start) # 12.08229374885559

第三に、コルーチンの性質

コルーチンは、シングルスレッドの性質であり、ユーザ自身のタスクによって制御はブロックIoは効率を向上させるために、実行する他のタスクに切り替え遭遇します。それを達成するために、我々は同時に、次の基準を満たすソリューションの方法を見つける必要があります。

  1. あなたは一時停止の位置に基づいて継続することが可能で、再実行するようにタスクのハンドオーバ状態に先立って、保存され、複数のタスク間の切り替えを制御することができます。
  2. 補足1:IO操作を検出することができ、スイッチングのみ操作面IO場合に発生します

我々はgenventモジュールを使用する必要が3.1コルーチン

キー:コルーチンを実装するために使用しgeventは可能ですが、我々はコルーチンのメインIOは、理にかなって経験しているが、ちょうどこのgeventモジュールコルーチン本当の意味を行うことができないと述べ、彼ながら、このモジュール検出不可能なIO

但用gevent模块是检测不到IO的,也就是说这样写同样是没有意义的

で、次の手順geventクラスです

  1. gevent.spawn性質は、静的メソッドはgevent.greenlet.Greenletクラスを生む呼び出します。

    @classmethod
    def spawn(cls, *args, **kwargs):
        g = cls(*args, **kwargs)
        g.start()
        return g
  2. このクラスのメソッドを呼び出しGreenlet、* __ INIT _ * _ 2つの関数クラスを、最も重要で初期化機能を起動するコードです: 

    def __init__(self, run=None, *args, **kwargs):
       greenlet.__init__(self, None, get_hub()) # 将新创生的greenlet实例的parent一律设置成hub
       if run is not None:
       self._run = run
# 在这段程序我们发现,这段程序并没有实现遇见IO的时候,用户模cpu实现任务切换
import gevent
import time

def eat():
    print('eat 1')
    time.sleep(2)
    print('eat 2')
def play():
    print('play 1')
    # 疯狂的计算呢没有io
    time.sleep(3)
    print('play 2')

start = time.time()
g1 = gevent.spawn(eat)
g2 = gevent.spawn(play)
g1.join()
g2.join()
end = time.time()
print(end-start) 5.0041022300720215

'''
结果:
eat 1
eat 2
play 1
play 2
5.004306077957153
'''

キーを2:タスクの実現の間で前後に切り替えるときに使用パッチのgevent geventクラスによって、真に意味のあるコルーチンを達成するために、達成するために、オペレーティングシステムに利用者の真の実現はIOをシミュレートする方法を見つけることができませんが発生しました

注:ここで再び、コルーチンがされて不可欠な意味状態Gacheの変更を保存するシングルスレッドのタスクで達成し、本当のコルーチンはしなければならないIOの場合に満たされます

from gevent import monkey;monkey.patch_all()
import gevent
import time

def eat():
    print('eat 1')
    time.sleep(2)
    print('eat 2')
def play():
    print('play 1')
    # 疯狂的计算呢没有io
    time.sleep(3)
    print('play 2')

start = time.time()
g1 = gevent.spawn(eat)
g2 = gevent.spawn(play)
g1.join()
g2.join()
end = time.time()
print(end-start)# 3.003168821334839

'''
结果:
eat 1
play 1
eat 2
play 2
3.003168821334839
'''

おすすめ

転載: www.cnblogs.com/xichenHome/p/11569119.html