多线程 - python如何让后台线程执行必要的操作后再退出?

查看:249
本文介绍了多线程 - python如何让后台线程执行必要的操作后再退出?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我写了一个web服务,服务启动的时候会另起一个线程去扫描特定目录的文件入库,并且把文件名及扫描的位置记入redis。

  • 文件大小会变动(其他程序尾部写入)

  • 文件数目也会变动

  • 我不知道什么时候变动

所以这个扫描的线程是每分钟去遍历一次文件目录。现在问题来了:

  1. 如果扫描线程是Daemon线程,那么Web服务一关,它立马随之结束,可能已扫描信息还没有记录,重启Web服务的时候数据会不同步。

  2. 如果扫描线程是非Daemon线程,即便Web服务关闭的时候手动关闭扫描线程,由于time.sleep(60)语句会阻塞线程,线程不会立即结束,也很麻烦。

我现在采用的是方法1,在主程序关闭的时候手动关闭扫描线程,并且sleep了1s,防止子线程直接退出。感觉非常粗糙……

求问优雅的实现方式。

解决方案

需要的是线程间通信的方式,当主线程结束时,发一个信号给扫描线程,然后join它。扫描线程收到后,结束自己。
线程间通信的方式有很多了,比如用Thread Event。甚至你用redis来通信都没问题

例子

import threading
import time

class StoppableThread(threading.Thread):
    def __init__(self, event):
        super(StoppableThread, self).__init__()
        self.event = event

    def run(self):
        while True:
            print('OK')
            if self.event.wait(timeout=1): # 这里的timeout可以是1分钟
                break # 表示有人通知要退出了

event = threading.Event()
t = StoppableThread(event)
t.start()
time.sleep(5)
event.set()
t.join()

这篇关于多线程 - python如何让后台线程执行必要的操作后再退出?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆