小編給大家分享一下如何解決python線程卡死的問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)公司從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目做網(wǎng)站、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元河南做網(wǎng)站,已為上家服務(wù),為河南各地企業(yè)和個人服務(wù),聯(lián)系電話:189820811081. top命令和日志方式判定卡死的位置
python代碼忽然卡死,日志不輸出,通過如下方式可以確定線程確實已經(jīng)死掉了:
# top 命令
top命令可以看到機(jī)器上所有線程的執(zhí)行情況,%CPU和%MEM可以看出線程消耗的資源情況
由于機(jī)器上線程數(shù)量太多,可能要查看的線程的信息在top命令當(dāng)前屏幕上顯示不出來可以通過如下方式查看
在top命令下輸入:u
接下來會提示輸入用戶名,就可以查看該用戶所執(zhí)行的所有線程
Which user (blank for all): denglinjie
這樣就可以看到degnlinjie用戶的所有線程
可以看到那幾個卡死線程的%CPU和%MEM都為0,說明線程根本沒有消耗資源,那么可以看出線程已經(jīng)卡死了
接下來通過打日志的方式來確定線程究竟是卡死在哪里了,線程卡死的地方大多數(shù)都是在io或者h(yuǎn)ttp請求那,所以以后遇到線程卡死的情況,就通過打日志的方式來確定卡死的位置,最終定位到問題確實是一個http服務(wù)掛掉了,而且此時requests.get()我雖然設(shè)置了超時,但是竟然無效
2 . 服務(wù)進(jìn)程數(shù)量不足導(dǎo)致的客戶端進(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()
客戶端代碼
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)程總共開啟了15個,每個進(jìn)程會打開一個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ù)進(jìn)程,所以只能同時處理10個請求,而我客戶端打開的thrift連接一直沒有關(guān)閉,所以10個服務(wù)進(jìn)程被10個客戶端連接霸占了,另外5個進(jìn)程獲取不到連接,自然就一直卡住了。
以上是“如何解決python線程卡死的問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
分享標(biāo)題:如何解決python線程卡死的問題-創(chuàng)新互聯(lián)
鏈接URL:http://bm7419.com/article8/cdepop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、軟件開發(fā)、網(wǎng)站維護(hù)、標(biāo)簽優(yōu)化、移動網(wǎng)站建設(shè)、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容