当我们使用Python从MongoDB里面读取数据时,可能会这样写代码:

只有当你使用for循环开始迭代它的时候,游标才会真正去数据库里面读取数据。
但是,如果每一次循环都连接数据库,那么网络连接会浪费大量时间。
所以pymongo会一次性获取100行,for row in handler.find()循环第一次的时候,它会连上MongoDB,读取一百条数据,缓存到内存中。于是第2-100次循环,数据都是直接从内存里面获取,不会再连接数据库。
当循环进行到底101次的时候,再一次连接数据库,再读取第101-200行内容……
这个逻辑非常有效地降低了网络I/O耗时。
但是,MongoDB默认游标的超时时间是10分钟。10分钟之内,必需再次连接MongoDB读取内容刷新游标时间,否则,就会导
致游标超时报错:
pymongo.errors.CursorNotFound: cursor id 211526444773 not found
如下图所示:

所以,回到最开始的代码中来,如果parse_data每次执行的时间超过6秒钟,那么它执行100次的时间就会超过10分钟。此时,当程序想读取第101行数据的时候,程序就会报错。
为了解决这个问题,我们有4种办法:

接下来在with的缩进里面人为制造异常:

无论在with的缩进里面发生了什么,Test这个类中的__exit__里面的代码始终都会运行。
我们来看看pymongo的游标对象里面,__exit__是怎么写的,如下图所示:

可以看到,这里正是关闭游标的操作。
因此,如果我们使用上下文管理器,就可以放心大胆地使用no_cursor_timeout=True参数了。
本篇文章到此结束,如果您有相关技术方面疑问可以联系我们技术人员远程解决,感谢大家支持本站!