Subscribed unsubscribe Subscribe Subscribe

SE Can't Code

A Tokyo based Software Engineer. Not System Engineer :(

デーモンスレッド

最近会社の伝統人事施策があったため、まとまった時間が取れずに記事を書けずにいたけれど、前々から書こう書こうと思っていたテーマを書きたいと思います。

以下、HelloWorldを1秒ごとに5回表示するプログラムがあります。

import time
from Lib.Task import Task, Message

class GreetingMessage(Message):
    def __init__(self, msg, count):
        super().__init__(msg, count)

class Greeting(Task):
    def __init__(self):
        super().__init__()

    def handle_GreetingMessage(self, msg, count):
        while count > 0:
            print("Hello, " + msg)
            time.sleep(1)
            count -= 1

if __name__ == "__main__":
    greeting_task = Greeting()
    greeting_task.start()
    greeting_task.put_message(GreetingMessage("World", 5))


Taskってのはここではスルーしてください。 このプログラムを叩いてみるとどうなるかというと、1秒ごとに「Hello, World」が表示され、そのままプログラムが終了せずにスレッドが生き残ってしまいます。最初ターミナルで叩いたときに5回表示されたのに全く終わる気配を見せなかったため、いろいろと調べたのですが、どうもサブスレッドが死んでいないため、メインが死んでも裏で生き残ってしまうようです。 では、こいつを解決するにはどうするかというと、setDaemon(boolean)を利用します。


import time
from Lib.Task import Task, Message

class GreetingMessage(Message):
    def __init__(self, msg, count):
        super().__init__(msg, count)

class Greeting(Task):
    def __init__(self):
        super().__init__()
        self.setDaemon(True)

    def handle_GreetingMessage(self, msg, count):
        while count > 0:
            print("Hello, " + msg)
            time.sleep(1)
            count -= 1

if __name__ == "__main__":
    greeting_task = Greeting()
    greeting_task.start()
    greeting_task.put_message(GreetingMessage("World", 5))
    time.sleep(5)

setDaemon(True)を入れることによって、該当処理がデーモンスレッドと認識されるようになり、そいつが終了していなくても、それ以外のデーモンでないスレッドがすべて終了しているならプログラム全体が終了します。このプログラム上では、メインスレッドが終了することで、デーモンスレッドも終了することになります。

また、メインにtime.sleep(5)を挟んでいる理由としては、こいつを入れないとメインはすぐに終了してしまい、デーモンの動く機会が失われてしまうからです。メインを5秒間sleepさせている間に、デーモンが動いて、5秒経ったらメインが動き終了するイメージとなります。


これはマルチスレッドプロセスで並列動作させる時に出てくる処理ですね。メインを動かしている裏でスレッドを動かす際は頭に入れておかないといけないことだと思います。

どうもありがとうございますた。

Remove all ads