我写了一个web服务,服务启动的时候会另起一个线程去扫描特定目录的文件入库,并且把文件名及扫描的位置记入redis。
文件大小会变动(其他程序尾部写入)
文件数目也会变动
我不知道什么时候变动
所以这个扫描的线程是每分钟去遍历一次文件目录。现在问题来了:
如果扫描线程是Daemon线程,那么Web服务一关,它立马随之结束,可能已扫描信息还没有记录,重启Web服务的时候数据会不同步。
如果扫描线程是非Daemon线程,即便Web服务关闭的时候手动关闭扫描线程,由于time.sleep(60)语句会阻塞线程,线程不会立即结束,也很麻烦。
我现在采用的是方法1,在主程序关闭的时候手动关闭扫描线程,并且sleep了1s,防止子线程直接退出。感觉非常粗糙……
求问优雅的实现方式。
需要的是线程间通信的方式,当主线程结束时,发一个信号给扫描线程,然后join它。扫描线程收到后,结束自己。
线程间通信的方式有很多了,比如用Thread Event。甚至你用redis来通信都没问题
例子