解决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操作mysql中文显示乱码的解决方法
Oct 11 Python
Python3实现从指定路径查找文件的方法
May 22 Python
Python实现邮件的批量发送的示例代码
Jan 23 Python
查看django执行的sql语句及消耗时间的两种方法
May 29 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
Python创建或生成列表的操作方法
Jun 19 Python
在vscode中配置python环境过程解析
Sep 28 Python
python绘制BA无标度网络示例代码
Nov 21 Python
PyCharm下载和安装详细步骤
Dec 17 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
Feb 02 Python
Python基本知识点总结
Apr 07 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
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
PHP与SQL注入攻击[一]
2007/04/17 PHP
php获取mysql版本的几种方法小结
2008/03/25 PHP
php获取某个目录大小的代码
2008/09/10 PHP
php 注册时输入信息验证器的实现详解
2013/07/05 PHP
php的socket编程详解
2016/11/20 PHP
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
2013/03/26 Javascript
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
JQuery记住用户名和密码的具体实现
2014/04/04 Javascript
javascript实现切换td中的值
2014/12/05 Javascript
javascript日期处理函数,性能优化批处理
2015/09/06 Javascript
18个非常棒的jQuery代码片段
2015/11/02 Javascript
checkbox 选中一个另一个checkbox也会选中的实现代码
2016/07/09 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
2017/12/27 Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
python远程连接MySQL数据库
2019/04/19 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
墨尔本最受欢迎的复古风格品牌:Princess Highway
2018/12/21 全球购物
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
2015年“公民道德宣传日”活动方案
2015/05/06 职场文书
投资合作意向书范本
2015/05/08 职场文书
党员学习型组织心得体会
2019/06/21 职场文书
用几道面试题来看JavaScript执行机制
2021/04/30 Javascript
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB