4

いつ使用しdummy_threadingますか?

システム レベルのスレッドが Python で使用できない場合に備えて、システム レベルのスレッドをモック スレッドに置き換える可能性があると考えていました。

しかし、これを実行すると:

import dummy_threading as threading

semaphore = threading.Semaphore()
def f(i):
    semaphore.acquire()
    print i
for i in xrange(10):
    threading.Thread(target=f, args=(i,)).start()
for _ in xrange(10):
    semaphore.release()

0表示され、プログラムが終了しません。それだけでなく、Python はコンピュータのメモリがなくなるまで、不可解にもメモリを食い尽くし続けます。

これを実行すると:

import threading

semaphore = threading.Semaphore()
def f(i):
    semaphore.acquire()
    print i
for i in xrange(10):
    threading.Thread(target=f, args=(i,)).start()
for _ in xrange(10):
    semaphore.release()

私は0 1 3 5 7 9 2 4 6 8期待通りに取得します。

私は誤解しなければなりませんdummy_threading。いつ使用しますか?

参考までに、比較のために Windows 7 と Fedora 18 でこれを試したところ、同じ結果が得られました。

編集:ただし、次のようになります0 1 2 3 4 5 6 7 8 9

import dummy_threading as threading

event = threading.Event()
def f(i):
    event.wait()
    print i
for i in xrange(10):
    threading.Thread(target=f, args=(i,)).start()
event.set()

大きな問題は次のとおりです: は何をしdummy_threading ますか?あるいは、いつ と同じ動作をするのthreadingでしょうか?

4

2 に答える 2

5

このモジュールは、プラットフォームで使用できない場合に使用することを目的としthreadthreadingいます。

それに渡す関数は同期的.start()に呼び出され、すぐに呼び出しました。最初の関数がセフォアを取得して出力し、次に 2 番目の関数が呼び出されてブロックされます。同期的に実行され、戻りません。

dummy_threadドキュメントから:

別のスレッドが作成されるのを待ってブロックする作成中のスレッドからデッドロックが発生する可能性がある場合、このモジュールを使用しないように注意してください。これは、ブロッキング I/O でよく発生します。

およびEFF-bot の投稿から(それ以外の場合は短く、作業リンクがありません):

サポートされている場合はスレッドを使用するが、スレッドをサポートしていない Python バージョンでも実行されるコードを簡単に記述できるようにするヘルパー。ダミー モジュールは、単純にスレッドを順番に実行します。

簡単にする部分に注意してください。dummy_threading実際のスレッドがなければ、例のようにコードがデッドロックしないとは期待できません。

于 2013-04-21T17:38:15.843 に答える
4

ではdummy_threading、スレッドは単なる関数ラッパーであり、順次実行されます。

2 番目のスニペットの問題は、対応する呼び出しが終了dummy_threading.Thread.start()するまで返されないことです。fスレッド0はセマフォを取得し、スレッド1はそれを取得してブロックしようとします。また、ブロックされているスレッドは 1 つしかないため、セマフォを解放するものはありません。

更新: ダミー イベントの動作に関する調査を行いました。

実際、、などのすべてはSemaphore、ダミーロックを使用していることを除いて、通常の場合とまったく同じです (これにはいくつかのインポート マジックが行われています)。スレッド。どちらも によって使用されるロックをブロックしませんが、リソースが使用可能になるまで内部的にセマフォ ループします。EventConditiondummy_threadingthreadingevent.wait()Semaphore

 while self.__value == 0:  # Here it will loop forever
    if not blocking:
        break
    ....
    self.__cond.wait()

ダミーイベントは、引数なしで呼び出されるたびにイベントが設定されたことを意味するという仮定に違反していると思いwaitますが、それが簡単に解決できるかどうかはわかりません。

于 2013-04-21T17:52:23.380 に答える