多线程 - python如何让后台线程执行必要的操作后再退出?
本文介绍了多线程 - python如何让后台线程执行必要的操作后再退出?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
我写了一个web服务,服务启动的时候会另起一个线程去扫描特定目录的文件入库,并且把文件名及扫描的位置记入redis。
文件大小会变动(其他程序尾部写入)
文件数目也会变动
我不知道什么时候变动
所以这个扫描的线程是每分钟去遍历一次文件目录。现在问题来了:
如果扫描线程是Daemon线程,那么Web服务一关,它立马随之结束,可能已扫描信息还没有记录,重启Web服务的时候数据会不同步。
如果扫描线程是非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屋!
查看全文