扫码关注官方订阅号
我有一个数据库,里面有1千万的数据,每条数据存放一个url,我要测试这个url是否是可以链接的,使用python实现,什么思路? 使用twisted还是gevent? 如果使用gevent,如何动态添加url,比如我gevent的pool设置为100,在数据库中取出数据的时候如何遍历最高效?
认证高级PHP讲师
都行,建议你用队列来序列化整个工作,redis这种kv数据库级的或者是gevent.queue这种协程级的或者是multiprocessing.queue这种跨进程的队列都行……
目测这个工作主要瓶颈在检查url是否正常(http code 2xx?),次瓶颈在从数据库读这10M条记录。 对于检查url的工作,可以通过gevent/twisted/多线程/多进程来并发,就像你说的pool设置到100。 对于从数据库读出记录,并行不见得比串行访问更快……
所以,开一个到两个reader从数据库读,开100个以上的checker去检查url就可以了。中间放一个queue用来通信。 是这样的结构: reader ---(写入)--> 队列 ---(读出)--> checker
reader ---(写入)--> 队列 ---(读出)--> checker
至于队列用什么实现,不是很重要……因为瓶颈不在这儿…… 从数据库读就很容易了,如果只有一个reader,就select * from table得到一个完整的数据集,遍历写入队列即可
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
都行,建议你用队列来序列化整个工作,redis这种kv数据库级的或者是gevent.queue这种协程级的或者是multiprocessing.queue这种跨进程的队列都行……
目测这个工作主要瓶颈在检查url是否正常(http code 2xx?),次瓶颈在从数据库读这10M条记录。
对于检查url的工作,可以通过gevent/twisted/多线程/多进程来并发,就像你说的pool设置到100。
对于从数据库读出记录,并行不见得比串行访问更快……
所以,开一个到两个reader从数据库读,开100个以上的checker去检查url就可以了。中间放一个queue用来通信。
是这样的结构:
reader ---(写入)--> 队列 ---(读出)--> checker
至于队列用什么实现,不是很重要……因为瓶颈不在这儿……
从数据库读就很容易了,如果只有一个reader,就select * from table得到一个完整的数据集,遍历写入队列即可