XiaoHu日志 7/29~8/9

7/29~8/9 最近在搞过评查询,过评查询跟之前的课程查询有些许异同,他们的实体定位都很不稳定,除了难以定位的“学科”实体外,过评查询还多了一个“过评项”实体,好在这两种实体都有着共同的特点——他们都可以被描述为一个已知词集的子集。对于学科实体,我维护了一个通过学生课程表分词而成的可能的学科词汇库,对于过评项,我也可以维护一个过评项成绩库。这两个库的区别在于,一个是对于全体学生永久存在的,一个是针对某人在最近十天的,他们的体量区别很大,所以我不打算存储过评项词汇库。有了这两个词汇库,我甚至无需再标注实体,后台程序拿到交互命令后可以直接把两个实体parse出来。过评查询分为三种意图,一种是类似于“我XX的XX多少分”的定向查询,一种是“我XX多少分”请求recent的结果,另一种是总评查询,语料上跟前两种很相似,但是实现过程又比较特殊。

         过评查询需要特定的token,因为是模拟前端来获取token,所以一个人的token就需要15秒来进行获取。用户发问后再去获取显然太慢,所以我维护一个不间断刷新的token库。还要考虑新用户绑定的问题,新用户绑定后肯定会继续发出查询请求,所以token也需要立即获取,然而这15秒无法避免,只能提示用户稍候一段时间。新token插入到库中又会出现一个“真空”的问题。Token库的维护流程是先读取库里的内容并存为数组,然后对于每个人获取其token,再把新token更新到数组中,再把数组写入库中,获取token的15秒被我叫做真空期,在真空期中针对库的所有文件操作都是无效的,因为库中的所有内容都在之前被读了出来,15秒后又会写进去,程序并不知道这15秒内发生了什么,它只会在15秒后把库中15秒前的东西加上一个新token一块覆盖写入。解决这个问题,要么在每次插入新token时都避开真空期,要么另辟捷径。从概率角度看,法1显然不可能。为了解决这个问题,我设置了一个缓冲文件,主程序在绑定新用户时会把其token信息写到缓冲文件里,在token库的一次获取token操作(也就是15秒真空)结束后,它会读取缓冲文件,并将其内容append到token库里,然后再清除缓冲文件。这样就避开了真空期。苛刻的讲,如果在读取缓冲文件后,插入token文件前的时间区间里,主程序向缓冲文件写入了新内容,那么新内容也会无效。不过这两种真空没有可比性,一个是15秒和O(1)的重合,一个是O(1)和O(1)的重合,后者可以忽略不计。在编写这部分代码时我也遇到了一些离奇的bug,我在对一个变量进行两次类型转换时会报语法错误,但如果我每次转换后把它赋值给一个中间变量,然后再转换就不会报错,理论上这是等价的,不知道python没有明确类型限制的变量蕴藏了什么奥妙。

          在解决token库的问题后,我又遇到了一个棘手的问题,获取token需要学号和密码,但是我除了用15秒去进行模拟希悦登陆外没有其他办法。而这15秒又足以让微信公众号返回超时,于是我问了希悦的工程师想知道他们表单post的api地址,谁知道他直接改了api的token限制,让我用之前课程查询的token就可以使用过评查询api。解决了问题,但是我比较不爽。从6/30到现在,我至少拿了半个月的时间十几个小时放在这个与众不同的api和其token上,先是建个网页来获取需要跳转来得到的token,然后捣鼓一下午socket.io,然后思考优化时间的方式,再维护token库和缓冲文件,都花了我不少精力。他一抬手,我就能省下现在看来已经无谓的很多时间。我也不知道该不该删除那些代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值