Skip to content
This repository has been archived by the owner on Aug 4, 2020. It is now read-only.

日志切分问题 #3

Open
shiyong-1224 opened this issue Mar 9, 2018 · 9 comments
Open

日志切分问题 #3

shiyong-1224 opened this issue Mar 9, 2018 · 9 comments

Comments

@shiyong-1224
Copy link

你好,为了记录日志信息,我在group.py中也导入了CQLog,但是发现日志达到1M之后无法切分,百度一下发现是main和group两个进程在同时使用log文件产生冲突。请问怎么解决呢?
然后我想着把main和group两个模块整合到一起,启动时只用运行一个py文件,但是目前还未成功。
本人是初学者,以上两个问题能否指教一下,谢谢。

@chinshin
Copy link
Owner

chinshin commented Mar 9, 2018

  1. CQLog 用的logging 模块多线程安全,但是不多进程安全;我准备在下次更新(就这两天)时换用多进程安全的ConcurrentLogHandler;

  2. main.py要持续调用计划任务,group.py要持续开启监听接口,分成两个进程较好;如果非要用一个 py 调起两个文件,我暂时只能想到用多线程实现,但是多线程可能会跑满 CPU 一个核,效率极低,不建议使用。

@shiyong-1224
Copy link
Author

还有一个问题,获取摩点订单之后,用订单时间与系统时间进行对比。如果系统时间与摩点的系统时间存在一两秒的偏差(系统时间快几秒),那么可能会出现有的订单会漏掉的可能性。

@chinshin
Copy link
Owner

  1. 一个 py多线程跑main.pygroup.py你可以写一下测试一下,看看资源占用如何;我测试的时候跑满 cpu 应该是我测试函数里放了while True 的问题。

  2. 用系统时间对比订单时间确实会有可能出现偏差,测试下来误差在毫秒级。
    考虑过将订单写入数据库,这样初始化设置比较繁琐;
    考虑过将订单写入一个.csv 文件,最近比较忙,还未来得及实现。

  3. 摩点api有一些已知 bug:api 返回订单总额有时会与实际总额产生偏差,可能是数值转换造成的精度问题; api 返回项目进度会存在滞后,可能是摩点api缓存造成的;api 返回的 order 信息偶尔会出错(一次返回20个非指定 pro_id 的订单信息)。

@shiyong-1224
Copy link
Author

1.我试了一下,1核的云主机CPU占用率一直保持在15%以下(测试的时候手动以较高的频率发送“聚聚榜”)。代码是这样写的:把main里面bot的初始化语句删除,从group里面导入bot,group里面的bot.run()移到main中,和main中原先的sched.start()一起作为两个线程启动。
目前没什么大问题,但是出现过:响应群消息/私聊消息重复发送,以及摩点订单消息重复发送的问题,都是在刚启动时出现的,而且很难重现,不知道是不是线程的原因;再就是Ctrl+C没办法结束进程了,只能关闭控制台窗口。
2.订单时间比较,用一个全局变量记录上一次查询到的新订单中的最大时间戳,获取到新订单之后与它对比并更新。这样就没用到系统时间戳不会出现偏差问题。(我看你的口袋模块也是这样记录、对比消息时间的,但是不是用的全局变量而是存在配置文件中)

@chinshin
Copy link
Owner

订单时间比较这个逻辑需要加一个判断,因为摩点 api 偶尔会吐订单bug(一次返回20个非查询指定 pro_id 的订单信息)

@shiyong-1224
Copy link
Author

应该怎么处理呢,摩点api返回报文中没有pro_id这个属性,程序没办法知道获取到的订单是不是指定的项目

@chinshin
Copy link
Owner

一个想法:
如果查询的20个订单中有订单时间早于上一次查询的最新订单,且上一次查询的最新订单不包含在返回的20个订单中,则忽略这次查询并 log 记录一下;
如果查询的20个订单都晚(新)于上一次查询的最新订单,则忽略这次查询并 log 记录一下;

@chinshin
Copy link
Owner

这两天抽空看了一下,多进程安全的ConcurrentLogHandler基于 py2开发,且在 win 下无法使用。

暂且没空重新构思 CQLog,只能先复制多个CQLog.py 改文件名分别调用了

@shiyong-1224
Copy link
Author

复制一个CQLog再改名的方式我试过,因为RotatingFileHandler是单例模式所以没办法在两个log模块里使用。我目前的解决方式是把group整到main里面用两个线程来跑,所有日志都打在一个log文件里面

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants