解决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 修改文件指定行的方法
May 15 Python
Python学习笔记(二)基础语法
Jun 06 Python
Python中用于返回绝对值的abs()方法
May 14 Python
详解Python中的各种函数的使用
May 24 Python
Scrapy的简单使用教程
Oct 24 Python
python下载文件记录黑名单的实现代码
Oct 24 Python
详解python分布式进程
Oct 08 Python
Django框架模板介绍
Jan 15 Python
如何基于Python创建目录文件夹
Dec 31 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
Mar 30 Python
如何通过Python3和ssl实现加密通信功能
May 09 Python
python实现测试工具(一)——命令行发送get请求
Oct 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
php access 数据连接与读取保存编辑数据的实现代码
2010/05/12 PHP
字母顺序颠倒而单词顺序不变的php代码
2010/08/08 PHP
PHP中将数组转成XML格式的实现代码
2011/08/08 PHP
PHP实现时间轴函数代码
2011/10/08 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
迁移PHP版本到PHP7
2015/02/06 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
腾讯UED 漂亮的提示信息效果代码
2011/09/12 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
jQuery中index()方法用法实例
2014/12/27 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
node.JS事件机制与events事件模块的使用方法详解
2020/02/06 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
简析Python的闭包和装饰器
2016/02/26 Python
python 实现自动远程登陆scp文件实例代码
2017/03/13 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
django中静态文件配置static的方法
2018/05/20 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
Python while循环使用else语句代码实例
2020/02/07 Python
Python argparse模块使用方法解析
2020/02/20 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
十佳班主任事迹材料
2014/01/18 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
运动会拉拉队口号
2014/06/09 职场文书
甜品店创业计划书
2014/08/14 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS