解决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实现每次处理一个字符的三种方法
Oct 09 Python
Python 性能优化技巧总结
Nov 01 Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
Jul 27 Python
Python实现的爬取百度贴吧图片功能完整示例
May 10 Python
python画图的函数用法以及技巧
Jun 28 Python
Python图像处理PIL各模块详细介绍(推荐)
Jul 17 Python
在Python中使用MongoEngine操作数据库教程实例
Dec 03 Python
Python绘制二维曲线的日常应用详解
Dec 04 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 Python
Python爬虫设置ip代理过程解析
Jul 20 Python
python实现简单的名片管理系统
Apr 26 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生成HTML静态页面实例代码
2008/08/31 PHP
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
2011/10/31 PHP
ThinkPHP表单自动验证实例
2014/10/13 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
070823更新的一个[消息提示框]组件 兼容ie7
2007/08/29 Javascript
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
javascript弹出窗口实现代码
2015/11/12 Javascript
js实现可控制左右方向的无缝滚动效果
2016/05/29 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
使用Angular CLI进行单元测试和E2E测试的方法
2018/03/24 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
[01:04:05]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
python发送伪造的arp请求
2014/01/09 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
详解python内置模块urllib
2020/09/09 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
英国床垫在线:Mattress Online
2016/12/07 全球购物
Linux上比较文件的命令都有哪些
2013/09/28 面试题
人力资源专员自我评价怎么写
2013/09/19 职场文书
护士自我鉴定
2013/10/23 职场文书
幼儿教师自我鉴定
2013/11/02 职场文书
syb养殖创业计划书
2014/01/09 职场文书
班干部演讲稿
2014/04/24 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
Win11应用商店打开闪退怎么解决? win11应用商店打不开的多种解决办法
2022/04/05 数码科技
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL