1

私はProgrammingPython4thEditionを読んでいます。

コード(Python3.2)は次のとおりです。

import _thread

def action(i):
    print(i ** 32)

class Power:
    def __init__(self, i):
        self.i = i
    def action(self):
        print(self.i ** 32)

_thread.start_new_thread(action,(2,))
_thread.start_new_thread((lambda: action(2)), ())

obj = Power(2)
_thread.start_new_thread(obj.action,())

実行すると、画面に出力が表示されません。

$python3 thread-example.py
$

誰かがこれについてアイデアを持っていますか?

4

3 に答える 3

1

メインスレッドが終了すると、プロセス全体が終了します。

他のスレッドが完了するまでメインスレッドを待機させる必要があります。APIにはこれに対する規定はありません_thread(非常に低レベルです)。

threading.Thread.join()より優れたAPIを使用する場合は、を使用できます。

于 2013-01-06T05:03:23.297 に答える
1

アンダースコア_は、それがプライベート API であることを意味します (threadモジュールは 2005 年以降廃止されました)。threading代わりにモジュールを使用する必要があります。

from threading import Thread

# ...
Thread(target=action, args=[2]).start()
Thread(target=lambda: action(2)).start()
Thread(target=obj.action).start()

.join()メソッドを明示的に呼び出す必要はありません。非デーモン スレッドは、メイン スレッドが終了する前に自動的に結合されます。

于 2013-01-06T05:27:13.030 に答える
0

threadingモジュールを使用しないのはなぜですか (ここで確認してください)。あなたの例では、子スレッドが何かを印刷する前にメインスレッドが終了します。たとえば、例の最後に次を追加すると、私のシステムで動作します。

import time
time.sleep(5)

しかし、より複雑なケースでは、すべての子スレッドが終了する前にメインスレッドが終了しないことを保証することはできません。次の選択肢があります。

  • 各子スレッドからフラグを設定し、終了する前にメインスレッドからフラグをチェックし続けます (悪いアプローチ)。
  • time.sleepすべての子スレッドが終了するのにかかる最大時間スリープするために使用します (これも悪いアプローチです)。
  • threading.Thread.join各子が終了するまで待機するために使用します (適切なアプローチ)。(他の回答から明らかなように)
于 2013-01-06T05:41:52.870 に答える