解决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 19 Python
python爬虫入门教程之点点美女图片爬虫代码分享
Sep 02 Python
python结合opencv实现人脸检测与跟踪
Jun 08 Python
Python中的多行注释文档编写风格汇总
Jun 16 Python
Python标准库之itertools库的使用方法
Sep 07 Python
python中利用Future对象回调别的函数示例代码
Sep 07 Python
Python面向对象class类属性及子类用法分析
Feb 02 Python
Python正则匹配判断手机号是否合法的方法
Dec 09 Python
对python For 循环的三种遍历方式解析
Feb 01 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
Python表达式的优先级详解
Feb 18 Python
Python如何实现远程方法调用
Aug 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
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
vue+element模态框中新增模态框和删除功能
2019/06/11 Javascript
vue-froala-wysiwyg 富文本编辑器功能
2019/09/19 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
2020/10/28 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
详解Python中的array数组模块相关使用
2016/07/05 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
漂亮的Django Markdown富文本app插件的实现
2019/01/02 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
Pycharm安装第三方库失败解决方案
2020/11/17 Python
Python基于execjs运行js过程解析
2020/11/27 Python
利用CSS3 动画 绘画 圆形动态时钟
2018/03/20 HTML / CSS
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
PHP面试题-$message和$$message的区别
2015/12/08 面试题
如何写好升职自荐信
2014/01/06 职场文书
公司离职证明范本
2014/01/13 职场文书
测试工程师职业规划书
2014/02/06 职场文书
电焊工岗位职责
2014/03/06 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
2014年专项整治工作总结
2014/11/17 职场文书
党员剖析材料范文
2014/12/18 职场文书
优秀团支部申报材料
2014/12/26 职场文书
学校党风廉政建设调研报告
2015/01/01 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书
Nebula Graph解决风控业务实践
2022/03/31 MySQL