python故障查找:超时未设置

最近一台基于python的应用服务总是出现问题。需求是用户可以在页面上提交批量处理任务,后台把这些任务入到一个Queue里排队处理,然后通过一个线程专门处理。现在总是偶尔出现假死状态,任务处理中断执行。开始总是以为是哪里出错了,导致程序中断。可以检查程序,任务处理过程全部try了,并打印日志。但是查找日志没有任何出错。首先要排查的线程到底有没有活着,如果活着,是在哪里阻塞了,所以想对任务处理线程执行dump,然后分析。本以为是python中有像jvm中的jstack的工具,但是上网查找没有结果,并提问了相关问题求救别人:http://segmentfault.com/q/1010000000506442 . 所以只能分析调试程序运行时的线程状态:

查找出python运行的进程id是3125, 运行:

gdb -p 3125...gdb info threads

发现一个很明显的问题,recv阻塞了。而且fd=9. 所以怀疑是读流在哪里卡住了,因为我的应用主要是抓取互联网上其它网站的信息,所以先查看是否有连接没有释放。

ls -l  /proc/3125/fd

果然是一个socket连接没有释放, 然后想查看下这个fd=9的详细信息:

lsof -p 3125python  23243 tony    9u  IPv4             912004       0t0     TCP XXXXXX.linode.com:59047->205.204.96.104:http

然后这个ip就是抓取网站的ip。所以基本可以肯定是卡在这里了。因为我用的requests组件,本以为其默认会有一个读超时时间,但是查看文档没有发现, 所以手动加上:

requests.get(‘http://github.com‘, timeout=0.001)

python故障查找:超时未设置,布布扣,bubuko.com

时间: 2024-10-24 13:02:02

python故障查找:超时未设置的相关文章

ASP.NET 页面请求超时时间设置 Server.ScriptTimeOut executionTimeout

ASP.NET 页面请求超时时间(页面后台程序执行时间)默认值为 110 秒(在 .NET Framework 1.0 版和 1.1 版中,默认值为 90 秒) 即: Server.ScriptTimeout = 110(HttpServerUtility.ScriptTimeout = 110) System.Web.Configuration.HttpRuntimeSection().ExecutionTimeout.ToString() = 00:01:50(110 秒) 方法一:设置 S

JS基础知识——获取未设置行内元素的样式,定时器

一.getComputedStyle(document.getElementById("div1").width)在IE6,7,8下不兼容: document.getElementById("div1").currentStyle.width 在标准浏览器下不兼容 解决办法:属性判断 用上面两个方法,应注意以下问题: 获取到的是计算机(浏览器)计算后的样式 background: url() red …… 复合样式(不要获取) backgroundColor 单一样

基于rabbitMQ 消息延时队列方案 模拟电商超时未支付订单处理场景

前言 传统处理超时订单 采取定时任务轮训数据库订单,并且批量处理.其弊端也是显而易见的:对服务器.数据库性会有很大的要求,并且当处理大量订单起来会很力不从心,而且实时性也不是特别好 当然传统的手法还可以再优化一下,即存入订单的时候就算出订单的过期时间插入数据库,设置定时任务查询数据库的时候就只需要查询过期了的订单,然后再做其他的业务操作 jdk延迟队列 DelayQueue 采取jdk自带的延迟队列能很好的优化传统的处理方案,但是该方案的弊.端也是非常致命的,所有的消息数据都是存于内存之中,一旦

form中button未设置type值时点击后提交表单

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getS

VC socket Connect 超时时间设置

设置connect超时很简单,CSDN上也有人提到过使用select,但却没有一个令人满意与完整的答案.偶所讲的也正是select函数,此函数集成在winsock1.1中,简单点讲,"作用使那些想避免在套接字调用过程中被锁定的应用程序,采取一种有序的方式,同时对多个套接字进行管理"(<Windows网络编程技术>原话).使用方法与解释请见<Windows网络编程技术>. 在使用此函数前,需先将socket设置为非阻塞模式,这样,在connect时,才会立马跳过,

golang net http库相关超时的设置

net.http 包中的超时设置 app.Server.ReadTimeout app.Server.WriteTimeout 是针对所有请求设置的选项 默认 net.http keepalived 开启,超时时间为 3 分钟,如下 1942    type tcpKeepAliveListener struct { 1943          *net.TCPListener 1944    } 1945 1946    func (ln tcpKeepAliveListener) Accep

MYSQL的数据连接超时时间设置

大规模多线程操作事务的时候,有时候打开一个链接,会进行等待,这时候如果数据库的超时时间设置的过短,就可能会出现,数据链接自动被释放,当然设置过大也不好,慢SQL或其他因素引起的链接过长,导致整个系统被拖慢,甚至挂掉. SO,适当的设置超时时间. 网上查了很多资料,大多数解决方案都写的太复杂,其实只要设置一下等待超时时间就OK了 设置方法: SHOW GLOBAL VARIABLES LIKE '%timeout%'SET GLOBAL wait_timeout=10000

curl的超时时间设置

curl的超时时间设置 使用curl时,有两个超时时间:一个是连接超时时间,另一个是数据传输的最大允许时间. 连接超时时间: --connect-timeout 例: curl --connect-timeout 1 "http://localhost/index.html" 出错提示形如: curl: (28) connect() timed out! 不能连接提示如: curl:(7) couldn't connect to host 数据传输的最大允许时间用: -m 例: cur

该设备或资源(Web 代理)未设置为接受端口&quot;8087&quot;上的连接

Internet选项----连接----设置(默认的)-----在代理服务器那一项" 设置" "对此连接使用代理服务器"取消勾选即可. 该设备或资源(Web 代理)未设置为接受端口"8087"上的连接,布布扣,bubuko.com