欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決python線程卡死的問題

 更新時間:2019年02月18日 09:35:43   作者:田野上的希望  
今天小編就為大家分享一篇解決python線程卡死的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

1. top命令和日志方式判定卡死的位置

python代碼忽然卡死,日志不輸出,通過如下方式可以確定線程確實已經(jīng)死掉了:

# top 命令

top命令可以看到機器上所有線程的執(zhí)行情況,%CPU和%MEM可以看出線程消耗的資源情況

由于機器上線程數(shù)量太多,可能要查看的線程的信息在top命令當(dāng)前屏幕上顯示不出來可以通過如下方式查看

在top命令下輸入:u

接下來會提示輸入用戶名,就可以查看該用戶所執(zhí)行的所有線程

Which user (blank for all): denglinjie

這樣就可以看到degnlinjie用戶的所有線程

可以看到那幾個卡死線程的%CPU和%MEM都為0,說明線程根本沒有消耗資源,那么可以看出線程已經(jīng)卡死了

接下來通過打日志的方式來確定線程究竟是卡死在哪里了,線程卡死的地方大多數(shù)都是在io或者http請求那,所以以后遇到線程卡死的情況,就通過打日志的方式來確定卡死的位置,最終定位到問題確實是一個http服務(wù)掛掉了,而且此時requests.get()我雖然設(shè)置了超時,但是竟然無效

2 . 服務(wù)進程數(shù)量不足導(dǎo)致的客戶端進程卡死

服務(wù)端代碼:

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連接,打開后一直發(fā)送請求,并將處理的結(jié)果寫文件,全部執(zhí)行完成后才關(guān)閉thrift連接。

可是,發(fā)現(xiàn)從啟動到執(zhí)行了很長時間后,只有10個文件里面有內(nèi)容寫入,其中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服務(wù)端只啟動了10個服務(wù)進程,所以只能同時處理10個請求,而我客戶端打開的thrift連接一直沒有關(guān)閉,所以10個服務(wù)進程被10個客戶端連接霸占了,另外5個進程獲取不到連接,自然就一直卡住了。

以上這篇解決python線程卡死的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python使用openCV遍歷文件夾里所有視頻文件并保存成圖片

    python使用openCV遍歷文件夾里所有視頻文件并保存成圖片

    這篇文章主要介紹了python使用openCV遍歷文件夾里所有視頻文件并保存成圖片,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-01-01
  • Django auth 應(yīng)用模塊詳解

    Django auth 應(yīng)用模塊詳解

    這篇文章主要介紹了Django auth 應(yīng)用模塊,auth 模塊幫助開發(fā)人員提高了工作效率,因為每個 Web 站點的權(quán)限管理模塊或者用戶管理模塊基本都是相同的邏輯,Django 的 auth 模塊使開發(fā)者們不必在為一些重復(fù)性的邏輯進行構(gòu)建,需要的朋友可以參考下
    2022-11-11
  • python 模塊重載的五種方法

    python 模塊重載的五種方法

    這篇文章主要介紹了python 模塊重載的五種方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • Python雙端隊列deque的實現(xiàn)

    Python雙端隊列deque的實現(xiàn)

    雙端隊列deque支持從任意一端增加和刪除元素。本文詳細的介紹了Python雙端隊列deque的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • python鏈表的基礎(chǔ)概念和基礎(chǔ)用法詳解

    python鏈表的基礎(chǔ)概念和基礎(chǔ)用法詳解

    這篇文章主要為大家詳細介紹了python鏈表的基礎(chǔ)概念和基礎(chǔ)用法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Python連接MySQL數(shù)據(jù)庫并查找表信息

    Python連接MySQL數(shù)據(jù)庫并查找表信息

    本文主要介紹了Python連接MySQL數(shù)據(jù)庫并查找表信息,通過使用Python中的MySQL Connector模塊,連接到MySQL服務(wù)器并執(zhí)行SQL查詢語句,可以獲取表的結(jié)構(gòu)、列信息、行數(shù)據(jù)等,感興趣的可以了解一下
    2023-08-08
  • PyCharm+PySpark遠程調(diào)試的環(huán)境配置的方法

    PyCharm+PySpark遠程調(diào)試的環(huán)境配置的方法

    今天小編就為大家分享一篇PyCharm+PySpark遠程調(diào)試的環(huán)境配置的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python中為什么要用self探討

    Python中為什么要用self探討

    這篇文章主要介紹了Python中為什么要用self探討,本文講解了Python要self的理由、為何Python給self賦值而你不必給self賦值?等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • python實現(xiàn)簡單flappy bird

    python實現(xiàn)簡單flappy bird

    這篇文章主要為大家詳細介紹了python實現(xiàn)簡單flappy bird小游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 探究Python多進程編程下線程之間變量的共享問題

    探究Python多進程編程下線程之間變量的共享問題

    這篇文章主要介紹了探究Python多進程編程下線程之間變量的共享問題,多進程編程是Python學(xué)習(xí)進階中的重要知識,需要的朋友可以參考下
    2015-05-05

最新評論