如何解決python線程卡死的問(wèn)題-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)公司從2013年成立,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元河南做網(wǎng)站,已為上家服務(wù),為河南各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108

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

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

# top 命令

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

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

在top命令下輸入:u

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

Which user (blank for all): denglinjie

這樣就可以看到degnlinjie用戶(hù)的所有線程

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

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

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

服務(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()

客戶(hù)端代碼

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()

可以看到,進(jìn)程ParseSaveEsProcess進(jìn)程總共開(kāi)啟了15個(gè),每個(gè)進(jìn)程會(huì)打開(kāi)一個(gè)thrift連接,打開(kāi)后一直發(fā)送請(qǐng)求,并將處理的結(jié)果寫(xiě)文件,全部執(zhí)行完成后才關(guān)閉thrift連接。

可是,發(fā)現(xiàn)從啟動(dòng)到執(zhí)行了很長(zhǎng)時(shí)間后,只有10個(gè)文件里面有內(nèi)容寫(xiě)入,其中5個(gè)一直沒(méi)有寫(xiě)入:

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

原因是因?yàn)閠hrift服務(wù)端只啟動(dòng)了10個(gè)服務(wù)進(jìn)程,所以只能同時(shí)處理10個(gè)請(qǐng)求,而我客戶(hù)端打開(kāi)的thrift連接一直沒(méi)有關(guān)閉,所以10個(gè)服務(wù)進(jìn)程被10個(gè)客戶(hù)端連接霸占了,另外5個(gè)進(jìn)程獲取不到連接,自然就一直卡住了。

以上是“如何解決python線程卡死的問(wèn)題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享標(biāo)題:如何解決python線程卡死的問(wèn)題-創(chuàng)新互聯(lián)
鏈接URL:http://muchs.cn/article8/cdepop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈軟件開(kāi)發(fā)、網(wǎng)站維護(hù)、標(biāo)簽優(yōu)化移動(dòng)網(wǎng)站建設(shè)、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化