解决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 基于Twisted框架的文件夹网络传输源码
Aug 28 Python
Python字符串处理实现单词反转
Jun 14 Python
Tensorflow分类器项目自定义数据读入的实现
Feb 05 Python
Python3多线程基础知识点
Feb 19 Python
Python Pandas 箱线图的实现
Jul 23 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
pytorch-RNN进行回归曲线预测方式
Jan 14 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
May 11 Python
教你如何用python开发一款数字推盘小游戏
Apr 14 Python
Python绘制分类图的方法
Apr 20 Python
Python学习之包与模块详解
Mar 19 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
VOLVO车载收音机
2021/03/02 无线电
PHP XML操作类DOMDocument
2009/12/16 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
JS实现将人民币金额转换为大写的示例代码
2014/02/13 Javascript
javascript实现存储hmtl字符串示例
2014/04/25 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
2015/12/18 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
微信小程序实现分享朋友圈的图片功能示例
2019/01/18 Javascript
原生js生成图片验证码
2020/10/11 Javascript
Python Mysql自动备份脚本
2008/07/14 Python
详解Python中的多线程编程
2015/04/09 Python
用Python抢过年的火车票附源码
2015/12/07 Python
python读取oracle函数返回值
2016/07/18 Python
通过Python实现自动填写调查问卷
2017/09/06 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
在双python下设置python3为默认的方法
2018/10/31 Python
python中metaclass原理与用法详解
2019/06/25 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
2019/08/15 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
培训专员岗位职责
2014/02/26 职场文书
党校毕业心得体会
2014/09/13 职场文书
2015年生产车间工作总结
2015/04/22 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
Mysql 如何合理地统计一个数据库里的所有表的数据量
2022/04/18 MySQL