0

スレッドはPythonでどのように実装されていますか? Pythonはスレッドごとに個別のプロセスを作成しますか?

このコードを検討してください。

from threading import Thread
from time import sleep


class testThread(Thread):
    def __init__(self):
        Thread.__init__(self)
    def run(self):
        while True:
            print "Thread inner!"
            sleep(5)
threadTest = testThread()
threadTest.start()       
while True:
    print "Thread outer!"
    sleep(10)

シェルでこのコードを実行してから Ctrl+C を実行すると、「外側のスレッド」の出力が停止しますが、「kill -9 pid」コマンドを使用して手動で強制終了するまで、「内側のスレッド」が出力され続けます。

4

2 に答える 2

1

Linux では、各スレッドは個別のプロセスではなくスレッドです。スクリプトの実行時に起動されるプロセスを確認するために使用psすると、1 つの Python プロセスが表示されます。

threading モジュールのドキュメントには次のように記載されています。

スレッドは「デーモンスレッド」としてフラグを立てることができます。このフラグの意味は、デーモン スレッドだけが残ったときに Python プログラム全体が終了することです。初期値は作成スレッドから継承されます。フラグはデーモン プロパティを介して設定できます。

...

「メインスレッド」オブジェクトがあります。これは、Python プログラムの最初の制御スレッドに対応します。これはデーモン スレッドではありません。

行間を読むと、Python プログラム全体は、すべての非デーモン スレッド (メイン スレッドを含む) が終了したときにのみ終了します。

于 2013-03-25T23:29:11.400 に答える
1

スレッドは個別のプロセスではありません。メインスレッドと同じリソースを共有します。何が起こっているかというと、Python はすべてのスレッドの実行が終了するのを待ってから終了します。

メイン プロセスの終了後に Python を終了する場合は、他のすべてのスレッドをデーモン化します。これは次のように行うことができます。

...
threadTest.daemon = True
threadTest.start()
...

これは非常に基本的なスレッドで機能します。ただし、ドキュメント(上記のリンク)によると:

デーモン スレッドは、シャットダウン時に突然停止します。それらのリソース (開いているファイル、データベース トランザクションなど) が適切に解放されない可能性があります。スレッドを正常に停止させたい場合は、スレッドを非デーモンにし、イベントなどの適切なシグナル メカニズムを使用します。

于 2013-03-25T23:35:36.067 に答える