解决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 基础之字符串string详解及实例
Apr 01 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
好的Python培训机构应该具备哪些条件
May 23 Python
django1.11.1 models 数据库同步方法
May 30 Python
Python补齐字符串长度的实例
Nov 15 Python
使用Python画股票的K线图的方法步骤
Jun 28 Python
pycharm 激活码及使用方式的详细教程
May 12 Python
python开发前景如何
Jun 11 Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 Python
PyQt实现计数器的方法示例
Jan 18 Python
python playwright 自动等待和断言详解
Nov 27 Python
python中Pyqt5使用Qlabel标签播放视频
Apr 22 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学习之数组的定义和填充
2011/04/17 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
2017/02/15 PHP
javascript web页面刷新的方法收集
2009/07/02 Javascript
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
JavaScript中的类继承
2010/11/25 Javascript
一个轻量级的javascript库 pj介绍
2010/12/19 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
jQuery中$.each使用详解
2015/01/29 Javascript
原生js和jquery实现图片轮播特效
2015/04/23 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
浅谈JavaScript的闭包函数
2016/12/08 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
解决canvas画布使用fillRect()时高度出现双倍效果的问题
2017/08/03 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
2018/07/15 Javascript
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
js实现每日签到功能
2018/11/29 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
理解python中生成器用法
2017/12/20 Python
Python中的TCP socket写法示例
2018/05/11 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
UGG雪地靴德国官网:UGG德国
2016/11/19 全球购物
维也纳通行证:Vienna PASS
2019/07/18 全球购物
班主任工作实习计划
2015/01/16 职场文书
出国留学单位推荐信
2015/03/26 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
Java使用JMeter进行高并发测试
2021/11/23 Java/Android
python中数组和列表的简单实例
2022/03/25 Python