解决python线程卡死的问题


Posted in Python onFebruary 18, 2019

1. top命令和日志方式判定卡死的位置

python代码忽然卡死,日志不输出,通过如下方式可以确定线程确实已经死掉了:

# top 命令

top命令可以看到机器上所有线程的执行情况,%CPU和%MEM可以看出线程消耗的资源情况

由于机器上线程数量太多,可能要查看的线程的信息在top命令当前屏幕上显示不出来可以通过如下方式查看

在top命令下输入:u

接下来会提示输入用户名,就可以查看该用户所执行的所有线程

Which user (blank for all): denglinjie

这样就可以看到degnlinjie用户的所有线程

可以看到那几个卡死线程的%CPU和%MEM都为0,说明线程根本没有消耗资源,那么可以看出线程已经卡死了

接下来通过打日志的方式来确定线程究竟是卡死在哪里了,线程卡死的地方大多数都是在io或者http请求那,所以以后遇到线程卡死的情况,就通过打日志的方式来确定卡死的位置,最终定位到问题确实是一个http服务挂掉了,而且此时requests.get()我虽然设置了超时,但是竟然无效

2 . 服务进程数量不足导致的客户端进程卡死

服务端代码:

handler = SimilarityService()
transport = TSocket.TServerSocket('10.134.113.75', 1234)
factory = TBinaryProtocol.TBinaryProtocolFactory()
processor = Processor(handler)
server = TProcessPoolServer.TProcessPoolServer(processor, transport)
server.setNumWorkers(10)
server.serve()

客户端代码

docQue = queues.Queue(maxsize=1000)
pCount = 15
 
 
class ParseSaveEsProcess(multiprocessing.Process):
 
  def __init__(self, threadId):
    self.threadId = threadId
    multiprocessing.Process.__init__(self)
 
  def run(self):
    global docQue
    f = open('recall_match_file_all_simi.lst.%s' % self.threadId, 'w')
    try:
      transport = TSocket.TSocket('10.134.113.75', 1234)
      transport = TTransport.TBufferedTransport(transport)
      protocol = TBinaryProtocol.TBinaryProtocol(transport)
      client = Client(protocol)
      transport.open()
 
      while True:
        line = docQue.get(block=True)
        if not line:
          print 'thread%d run over' % self.threadId  
          break
 
        p = line.split('\t')
        if len(p) >= 6 and p[5] == 'simi_high':
          simi_str = client.calculate_similarity_by_itemurl(p[0])
          f.write(line + '\t' + simi_str + '\n')
        else:
          f.write(line + '\n')  
      transport.close()
    except Thrift.TException as e:
      print str(e)
      pass  
 
class PutUrlProcess(multiprocessing.Process):
 
  def __init__(self):
    multiprocessing.Process.__init__(self)
 
  def run(self):
    global docQue
    for line in open('recall_match_file.lst', 'r'):
      baikeid = line.strip()
      docQue.put(baikeid, block=True)
 
    for i in range(pCount):
      docQue.put(None, block=True)
 
 
if __name__ == '__main__':
  putProcess = PutUrlProcess()
  putProcess.start()
 
  for i in range(pCount):
    parseProcess = ParseSaveEsProcess(i)
    parseProcess.start()

可以看到,进程ParseSaveEsProcess进程总共开启了15个,每个进程会打开一个thrift连接,打开后一直发送请求,并将处理的结果写文件,全部执行完成后才关闭thrift连接。

可是,发现从启动到执行了很长时间后,只有10个文件里面有内容写入,其中5个一直没有写入:

111965 recall_match_file_all_simi.lst.0
  111878 recall_match_file_all_simi.lst.1
    0 recall_match_file_all_simi.lst.10
    0 recall_match_file_all_simi.lst.11
    0 recall_match_file_all_simi.lst.12
    0 recall_match_file_all_simi.lst.13
    0 recall_match_file_all_simi.lst.14
  113429 recall_match_file_all_simi.lst.2
  110720 recall_match_file_all_simi.lst.3
  111993 recall_match_file_all_simi.lst.4
  113691 recall_match_file_all_simi.lst.5
  113360 recall_match_file_all_simi.lst.6
  113953 recall_match_file_all_simi.lst.7
  112007 recall_match_file_all_simi.lst.8
  113818 recall_match_file_all_simi.lst.9

原因是因为thrift服务端只启动了10个服务进程,所以只能同时处理10个请求,而我客户端打开的thrift连接一直没有关闭,所以10个服务进程被10个客户端连接霸占了,另外5个进程获取不到连接,自然就一直卡住了。

以上这篇解决python线程卡死的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之开始真正编程
Sep 12 Python
Python的Bottle框架的一些使用技巧介绍
Apr 08 Python
django 解决manage.py migrate无效的问题
May 27 Python
Python中list查询及所需时间计算操作示例
Jun 21 Python
Python对CSV、Excel、txt、dat文件的处理
Sep 18 Python
Django使用paginator插件实现翻页功能的实例
Oct 24 Python
django基于restframework的CBV封装详解
Aug 08 Python
Python面向对象编程基础实例分析
Jan 17 Python
在ipython notebook中使用argparse方式
Apr 20 Python
python初步实现word2vec操作
Jun 09 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
Nov 09 Python
Pandas数据结构之Series的使用
Mar 31 Python
Python中时间datetime的处理与转换用法总结
Feb 18 #Python
对python中的try、except、finally 执行顺序详解
Feb 18 #Python
python调用matlab的m自定义函数方法
Feb 18 #Python
在Python文件中指定Python解释器的方法
Feb 18 #Python
Python字符串逆序的实现方法【一题多解】
Feb 18 #Python
浅谈pyqt5中信号与槽的认识
Feb 17 #Python
Laravel+Dingo/Api 自定义响应的实现
Feb 17 #Python
You might like
PHP+ACCESS 文章管理程序代码
2010/06/21 PHP
php数字转汉字代码(算法)
2011/10/08 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
Mac下快速搭建PHP开发环境步骤详解
2019/05/05 PHP
用Javascript 和 CSS 实现脚注(Footnote)效果
2009/09/09 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
通过js获取div的background-image属性
2013/10/15 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
2016/08/01 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
基于element-ui的rules中正则表达式
2018/09/04 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
[41:52]2018DOTA2亚洲邀请赛3月29日小组赛B组Effect VS Secret
2018/03/30 DOTA
Python合并多个装饰器小技巧
2015/04/28 Python
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
2015/05/15 Python
简单介绍Python2.x版本中的cmp()方法的使用
2015/05/20 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
Request的中断和ErrorHandler实例解析
2018/02/12 Python
Django中url的反向查询的方法
2018/03/14 Python
shallow copy和deep copy的区别
2016/05/09 面试题
心得体会开头
2014/01/01 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
群众路线学习笔记范文
2014/11/06 职场文书
《传颂之物 虚伪的假面》BD发售宣传CM公开
2022/04/04 日漫
详解Python中*args和**kwargs的使用
2022/04/07 Python
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android