3

我想向 Thread 子类添加一个新方法,这样我就可以告诉我的工作线程优雅地退出。像这样:

class MyThread(threading.Thread):
    def __init__(self):
        ...
        self.__stop_signal = False
        self.__signal_lock = threading.Lock()
        ...

    def run(self):
        ...
        self.__signal_lock.acquire(True)
        stop_signal = self.__stop_signal
        self.__signal_lock.release()
        if stop_signal:
            return
        ...

    def stop_elegantly(self):
        self.__signal_lock.acquire(True)
        self.__stop_signal = True
        self.__signal_lock.release()

那么这样做是否安全?

thread = MyThread()
thread.start()
...
thread.stop_elegantly()

谢谢。

4

2 回答 2

1

是的,它看起来不错。实际上,您可以通过以下方式更“优雅”地做到这一点:

def stop_elegantly(self):
    with self.__signal_lock:
        self.__stop_signal = True

实际上,我认为您甚至不需要锁来访问成员变量,因为将为您的子类的每个实例分配一个单独的锁。例如,参见这个答案stop(),它向子类添加了一个方法threading.Thread

于 2012-11-09T03:23:09.850 回答
0
    self.__signal_lock.acquire(True)
    stop_signal = self.__stop_signal
    self.__signal_lock.release()

上面的代码在循环中?如果是,我认为它运作良好。

于 2012-11-09T01:42:36.633 回答