解决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 相关文章推荐
Python3基础之条件与循环控制实例解析
Aug 13 Python
Python自定义主从分布式架构实例分析
Sep 19 Python
Python使用matplotlib绘制余弦的散点图示例
Mar 14 Python
Python实现检测文件MD5值的方法示例
Apr 11 Python
使用Python制作自动推送微信消息提醒的备忘录功能
Sep 06 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
Aug 29 Python
Python 实现opencv所使用的图片格式与 base64 转换
Jan 09 Python
Python基于smtplib模块发送邮件代码实例
May 29 Python
基于python判断字符串括号是否闭合{}[]()
Sep 21 Python
django使用channels实现通信的示例
Oct 19 Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 Python
OpenCV中resize函数插值算法的实现过程(五种)
Jun 05 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数据库方法
2013/11/11 PHP
php的GD库imagettftext函数解决中文乱码问题
2015/01/24 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
Javascript写入txt和读取txt文件示例
2014/02/12 Javascript
JS跨域问题详解
2014/11/25 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
node上的redis调用优化示例详解
2018/10/30 Javascript
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
[45:15]Optic vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
Python使用线程来接收串口数据的示例
2019/07/02 Python
python3实现带多张图片、附件的邮件发送
2019/08/10 Python
Python numpy数组转置与轴变换
2019/11/15 Python
python用什么编辑器进行项目开发
2020/06/17 Python
PyTorch: Softmax多分类实战操作
2020/07/07 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
Bluebella美国官网:英国性感内衣品牌
2018/10/04 全球购物
abstract是什么意思
2012/02/12 面试题
求职简历自荐信
2013/10/20 职场文书
服务员岗位责任制
2014/02/11 职场文书
周年庆促销方案
2014/03/15 职场文书
超市店庆活动方案
2014/08/31 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
作风转变年心得体会
2014/10/22 职场文书
安全保证书怎么写
2015/02/28 职场文书
廉政承诺书范文
2015/04/28 职场文书
谢师宴家长致辞
2015/07/27 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
go语言基础 seek光标位置os包的使用
2021/05/09 Golang