中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決python線程卡死的問題

發布時間:2021-08-04 11:08:35 來源:億速云 閱讀:916 作者:小新 欄目:開發技術

小編給大家分享一下如何解決python線程卡死的問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

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線程卡死的問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

开江县| 革吉县| 宽城| 综艺| 大荔县| 安丘市| 绥中县| 淳化县| 兰坪| 南城县| 锦屏县| 亳州市| 宜君县| 灵丘县| 社旗县| 苍梧县| 开阳县| 德江县| 罗城| 河间市| 龙胜| 定边县| 南宁市| 莱芜市| 北辰区| 大关县| 肥城市| 城市| 淮阳县| 乌拉特中旗| 来宾市| 黄浦区| 城口县| 塘沽区| 芜湖市| 平昌县| 襄垣县| 云和县| 抚州市| 乐昌市| 那坡县|