解决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如何对实例属性进行类型检查
Mar 20 Python
spark: RDD与DataFrame之间的相互转换方法
Jun 07 Python
Linux下python与C++使用dlib实现人脸检测
Jun 29 Python
根据DataFrame某一列的值来选择具体的某一行方法
Jul 03 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 Python
python科学计算之scipy——optimize用法
Nov 25 Python
Pytorch之卷积层的使用详解
Dec 31 Python
python判断两个序列的成员是否一样的实例代码
Mar 01 Python
使用 Python ssh 远程登陆服务器的最佳方案
Mar 06 Python
Selenium常见异常解析及解决方案示范
Apr 10 Python
Python HTMLTestRunner可视化报告实现过程解析
Apr 10 Python
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 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+shell实现多线程的方法
2015/07/01 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
JavaScript实现cookie的写入、读取、删除功能
2015/11/05 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
jQuery实现进度条效果代码
2015/12/17 Javascript
js发送短信倒计时的简单实现方法
2016/09/08 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
2019/09/05 Javascript
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)
2019/09/10 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
解析Python中的变量、引用、拷贝和作用域的问题
2015/04/07 Python
python获取一组汉字拼音首字母的方法
2015/07/01 Python
python装饰器实例大详解
2017/10/25 Python
浅谈Python中重载isinstance继承关系的问题
2018/05/04 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
使用Python3内置文档高效学习以及官方中文文档
2019/05/19 Python
python读写文件write和flush的实现方式
2020/02/21 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
python属于解释语言吗
2020/06/11 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
接待员岗位责任制
2014/02/10 职场文书
优秀高中生事迹材料
2014/02/11 职场文书
学习之星事迹材料
2014/05/17 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python
漫画「处刑少女的生存之道」第3卷封面公开
2022/03/21 日漫