3

Stackless Python のタスクレットについて、Google で大規模な調査を行いました。すべての情報源はそれをスレッドとして言及しています

stackless.com : マイクロスレッド: タスクレットは関数をラップして、マイクロスレッドとして起動できるようにします。

disinterest.orgv: タスクレット — 軽量スレッド

ただし、タスクレットは同時実行ではありません。コードの一部を実行します。

次のようなコード:

def function(n):
   print n
   print n
   stackless.schedule()

stackless.tasklet(function)(3)
stackless.tasklet(function)(10)
stackless.run()

印刷します

3
3
10
10

タスクレットは、stackless.schedule() に遭遇するまでコードを実行し、その後、最初または最後の一時停止の場所から次のタスクレットを実行します。

すべてのプログラマーは、「GOTO を使用しない」という黄金律を知っています。私の質問は次のとおりです。

GOTOとどう違うの?
タスクレットが並列実行されていない場合、タスクレットを使用する利点は何ですか?
それらが実際にはスレッドではないのに、なぜすべてのソースがそれらをスレッドの代替として言及しているのですか?

4

2 に答える 2

7

gotoとどう違うの?

これは、移動先を指定しないという点で goto とは異なります。タスクレットを明け渡す (を呼び出すstackless.schedule()) ことで、「ファイル x の n 行目から実行を開始する」のではなく、「今のところは完了しました。後で戻ってきてください」と言っているだけです。「goto はまずい」というアドバイスは、プログラムの実行を追跡できないスパゲッティ コードを記述できるという事実に由来しています。一方、タスクレット (またはコルーチン) は、各タスクレットが完了するまで実行されることがわかっているため、この点ではるかに優れています。

タスクレットが並列実行されていない場合、タスクレットを使用する利点は何ですか?

並行性は並列性とは異なります。並列処理とは、2 つのタスクが文字通り同時に実行されることです。同時実行とは、2 つのタスクの実行が重複する可能性があることですが、必ずしも両方がまったく同じ瞬間に実行されるとは限りません。タスクレットは並行ですが、並行ではありません。タスクレットの利点は、基本的に同時実行性です。

それらが実際にはスレッドではないのに、なぜすべてのソースがそれらをスレッドの代替として言及しているのですか?

より低いオーバーヘッドを得るために並列処理をあきらめることができる場合、これらはスレッドの代替手段です。厳密に並列ではない場合でも、複数の同時実行パスを許可するという点で、それらは依然としてスレッドです。

于 2014-04-03T23:35:22.370 に答える
2

これが次のことを想像するのにどのように似ているのかわかりません。

def Eat():
   while True:
        do_something()
        stackless.schedule()
def Play():
   while True:
        do_another_thing()
        stackless.schedule()

def Sleep():
    while True:
        do_something_else()
        stackless.schedule()

stackless.tasklet(Eat)()
stackless.tasklet(Play)()
stackless.tasklet(Sleep)()

それは本質的にシングルコアスレッドであり、各スレッドがいつ制御を別の待機中のタスクに放棄するかを決定します

リアルタイム オペレーティング システムがタスク スケジューリングを実装する方法と非常によく似ています。

于 2014-04-03T23:36:18.377 に答える