正常关闭一个资源丰富的线程

时间:2016-03-23 10:29:54

标签: multithreading python-2.7 events

我有以下函数,它是从类的函数调用的。我想将其称为非阻塞线程或守护进程。我希望它能够优雅地停止处理任何IO锁和数据库锁(发生在foo()内)。

def worker(fnames):
    while True:
        for f in fnames:
            while(not os.path.isfile(f)):
                time.sleep(SLEEP_INTERVAL)
            while os.stat(f).st_size < 1000000:
                time.sleep(SLEEP_INTERVAL)
            file= open(f, 'rb')
            #Do Something
            foo()
            os.remove(f)

我查看了第一个回复link并修改了代码。我是否为上述函数创建了一个驱动函数,从一个新线程运行驱动函数,并从下面的线程传递_stop事件标志到它?或者有更好的方法吗?

class StoppableThread(threading.Thread):
    def __init__(self, target, timeout):
        super(StoppableThread, self).__init__()
        self._target = target
        self._timeout = timeout
        self._stop = threading.Event()

    def run(self):
        while not self.stopped():
            self._stop.wait(self._timeout)  # instead of sleeping
            if self.stopped():
                continue
            self._target()

    def stop(self):
        self._stop.set()

    def stopped(self):
        return self._stop.isSet()

编辑: 我设法想到以下解决方案,但我发现它非常讨厌。任何帮助表示赞赏:

def run(self):
    while True:
        for f in fnames:
            while not self._stop.isSet():
                while(not os.path.isfile(f)):
                    self._stop.wait(SLEEP_INTERVAL)
                    if self._stop.isSet():
                        break;
                while os.stat(f).st_size < 1000000:
                    self._stop.wait(SLEEP_INTERVAL)
                    if self._stop.isSet():
                        break;
                if self._stop.isSet():
                    continue;                            
                file= open(f, 'rb')
                #Do Something
                foo()
                os.remove(f)
            if self._stop.isSet():
                break;
        if self._stop.isSet():
            break;

0 个答案:

没有答案