解决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在windows下实现备份程序实例
Jul 04 Python
python自动化测试之setUp与tearDown实例
Sep 28 Python
Python中set与frozenset方法和区别详解
May 23 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
Apr 15 Python
python实现批量图片格式转换
Jun 16 Python
手把手教你如何安装Pycharm(详细图文教程)
Nov 28 Python
python pytest进阶之conftest.py详解
Jun 27 Python
Python Selenium参数配置方法解析
Jan 19 Python
tensorflow实现在函数中用tf.Print输出中间值
Jan 21 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
Feb 14 Python
使用PyQt5实现图片查看器的示例代码
Apr 21 Python
python实现的人脸识别打卡系统
May 08 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
解决FastCGI 进程超过了配置的活动超时时限的问题
2013/07/03 PHP
PHP设计模式之简单投诉页面实例
2016/02/24 PHP
php表单处理操作
2017/11/16 PHP
laravel框架中间件 except 和 only 的用法示例
2019/07/12 PHP
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
jQuery隔行变色与普通JS写法的对比
2013/04/21 Javascript
jQuery之ajax删除详解
2014/02/27 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
Vue.js常用指令的使用小结
2017/06/23 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
JS实现“全选”和"全不选"功能代码实例
2020/02/06 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
express异步函数异常捕获示例详解
2020/11/30 Javascript
vue实现两个区域滚动条同步滚动
2020/12/13 Vue.js
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
深入解析Python编程中super关键字的用法
2016/06/24 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
Python数据持久化shelve模块用法分析
2018/06/29 Python
Django框架视图介绍与使用详解
2019/07/18 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
python数据归一化及三种方法详解
2019/08/06 Python
python多线程同步实例教程
2019/08/11 Python
如何更改 pandas dataframe 中两列的位置
2019/12/27 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
环境工程大学生自荐信
2013/10/21 职场文书
职工运动会邀请函
2014/01/19 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
医院院务公开实施方案
2014/05/03 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
首都博物馆观后感
2015/06/05 职场文书
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
TypeScript 内置高级类型编程示例
2022/09/23 Javascript