解决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 + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
Jul 14 Python
浅谈scrapy 的基本命令介绍
Jun 13 Python
django admin 后台实现三级联动的示例代码
Jun 22 Python
Python中的asyncio代码详解
Jun 10 Python
PyQt5实现QLineEdit添加clicked信号的方法
Jun 25 Python
详解Python对JSON中的特殊类型进行Encoder
Jul 15 Python
python3 批量获取对应端口服务的实例
Jul 25 Python
Python产生一个数值范围内的不重复的随机数的实现方法
Aug 21 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
Python利用Scrapy框架爬取豆瓣电影示例
Jan 17 Python
np.dot()函数的用法详解
Jan 17 Python
python中tkinter复选框使用操作
Nov 11 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
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
通过php删除xml文档内容的方法
2015/01/23 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
2015/09/25 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
jquery select下拉框操作的一些说明
2010/04/02 Javascript
判断浏览器的javascript版本的代码
2010/09/03 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
js局部刷新页面时间具体实现
2013/07/04 Javascript
jQuery如何获取同一个类标签的所有值(默认无法获取)
2014/09/25 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
2015/03/26 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
Angular.js如何从PHP读取后台数据
2016/03/24 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
JavaScript, select标签元素左右移动功能实现
2020/05/14 Javascript
Python修改Excel数据的实例代码
2013/11/01 Python
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
Python 文件操作的详解及实例
2017/09/18 Python
django利用request id便于定位及给日志加上request_id
2018/08/26 Python
python 去除二维数组/二维列表中的重复行方法
2019/01/23 Python
Python Web框架之Django框架Form组件用法详解
2019/08/16 Python
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
公司办公室岗位职责
2014/03/19 职场文书
融资租赁计划书
2014/04/29 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
班主任工作总结范文
2015/08/13 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
趣味运动会口号
2015/12/24 职场文书
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL