高效python脚本,6小时获取上千台MySQL数据库服务器(上)
理论上当运行该函数长时间未连接端口时会抛出错误,但在实际过程中,有时候不会抛出错误,程序一直阻塞。去查阅了mysqldb的文档,发现有个连接超时(connect_timeou)的参数选项(如下图),当连接超时时会抛弃该连接。但一测试马上发现这个参数形同虚设,根本没用! 无奈,只能手动给函数加上时间限制,考虑了以下两个方法。 方法一:使用signal.SIGALRM信号量,但SIGALRM只能在linux系统下使用 可参考: https://stackoverflow.com/questions/366682/how-to-limit-execution-time-of-a-function-call-in-python 方法二:使用多线程中的join()的超时参数,比如join(3)就是限制了子线程运行的时间为3秒。 在此我采用方法二: 但同时需要注意的是try...except是无法捕捉线程中的报错的,因为线程有独立的栈,线程产生的异常发生在不同的栈上,因此无法捕捉到线程的异常。即捕捉不到3306端口连接错误,就无法根据报错信息来分析端口的连接情况。但如果在线程内部使用try..except来捕捉报错的话,线程自身又不返回值,无法告诉主函数端口的连接情况,也就无法确定是否要进行密码爆破,或者什么时候密码爆破成功,这时候又该怎么办呢? 查阅网上的资料,发现有利用类的变量来传递线程内的消息,也有使用Queue库创建队列实例来传递数据的。但总觉得有些“臃肿”,不太满意。思考着突然豁然开朗,可以在线程运行的函数内部判断端口的连接情况,然后用threading.Event()的标志设置与否,来传递结果,让主函数知道接下来该如何运行。设置了标志说明要进行下一步操作,未设置标志则return退出当前操作。 关于threading.Event()的基础知识可参考: https://blog.csdn.net/u012067766/article/details/79734630 修改后的主函数: 这里就不放上完整的代码了,因为紧接着马上又改进了效率。 【编辑推荐】
点赞 0 (编辑:青岛站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |