该帖子有点长哈...不好意思🤪
是这样,这是一个爬虫项目的主程序入口,下面代码里面的 mongo_connection = mongo_connect( connect = False, server_selection_timeoutMS = 60000 )
用来连接数据库,但我在服务器上测试的时候发现一直提示 timeout 报错(详见上面的报错信息)
我查了不少文章,看到不少说是要在多进程开启后再给每一个进程连接 mongoDB ,所以一开始我将连接数据库的代码放到了三个爬取程序的开头(就是下文那三个 parser() 函数),但依旧报同样的错; 然后我在 GitHub 上面看到了一个关于多进程下 Pymongo 提示 UserWarning 的解答,里面提到了可以添加 connect = False 参数,但我试过还是不行,应该问题也不在这里; 然后我又修改了 serverSelectionTimeoutMS ,将时间改为 60 秒(嗯当然还是没用)
求大佬指点一下怎么在使用 concurrent.futures 开启多进程的情况下连接 mongoDB🙏🏽🙏🏽🙏🏽!谢谢!
下面贴了环境、报错信息和代码
CentOS 7.8.2003
python = 3.7.7
依赖包版本:
pymongo == 4.0.1
concurrent:Python 自带
该信息来源于日志
ERROR: 192.168.1.202:27017: timed out, Timeout: 60.0s, Topology Description: <TopologyDescription id: 622086a8ea6efc1d07de056f, topology_type: Unknown, servers: [<ServerDescription ('192.168.1.202', 27017) server_type: Unknown, rtt: None, error=NetworkTimeout('192.168.1.202:27017: timed out')>]>
import pymongo
from concurrent.futures import PoolProcessExecutor, as_completed
# 导入外部自定义模块
import ...
def run_spider(log_recorder, proxy):
"""
主程序,可启动目标网页的爬取程序
:param log_recorder: 日志记录工具
:param proxy: 项目专用代理
:return:
"""
log_recorder.info( "Spider starts running! :)" )
try:
# 连接数据库
mongo_connection = mongo_connect( connect = False, server_selection_timeoutMS = 60000 )
try:
# 主程序运行
council_parser( mongo_connection, log_recorder, proxy )
gd_province_parser( mongo_connection, log_recorder, proxy )
market_supervisor_parser( mongo_connection, log_recorder, proxy )
log_recorder.info( "Spider ran over! :)" )
# 爬取结束后断开数据库连接
mongo_connection.close()
except Exception as e:
log_recorder.error(f"{e} :(")
# 出现异常依然断开连接
mongo_connection.close()
except Exception as e:
log_recorder.error(f"{e}:(")
if __name__ == "__main__":
# 设置日志工具
regulation_logger = spiderLogger.get_logger('regulation')
# 设置代理
proxy = get_proxy()
# 多进程并发
with ProcessPoolExecutor(max_workers = 8) as executor:
fs = []
futures = executor.submit(run_spider, regulation_logger, proxy)
fs.append(futures)
for future in as_completed(fs):
result = future.result()
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.