解決python線程卡死的問(wèn)題
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ì)提示輸入用戶名,就可以查看該用戶所執(zhí)行的所有線程
Which user (blank for all): denglinjie
這樣就可以看到degnlinjie用戶的所有線程
可以看到那幾個(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)致的客戶端進(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)程總共開(kāi)啟了15個(gè),每個(gè)進(jìn)程會(huì)打開(kāi)一個(gè)thrift連接,打開(kāi)后一直發(fā)送請(qǐng)求,并將處理的結(jié)果寫文件,全部執(zhí)行完成后才關(guān)閉thrift連接。
可是,發(fā)現(xiàn)從啟動(dòng)到執(zhí)行了很長(zhǎng)時(shí)間后,只有10個(gè)文件里面有內(nèi)容寫入,其中5個(gè)一直沒(méi)有寫入:
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)求,而我客戶端打開(kāi)的thrift連接一直沒(méi)有關(guān)閉,所以10個(gè)服務(wù)進(jìn)程被10個(gè)客戶端連接霸占了,另外5個(gè)進(jìn)程獲取不到連接,自然就一直卡住了。
以上這篇解決python線程卡死的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python使用openCV遍歷文件夾里所有視頻文件并保存成圖片
這篇文章主要介紹了python使用openCV遍歷文件夾里所有視頻文件并保存成圖片,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-01-01Python雙端隊(duì)列deque的實(shí)現(xiàn)
雙端隊(duì)列deque支持從任意一端增加和刪除元素。本文詳細(xì)的介紹了Python雙端隊(duì)列deque的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06python鏈表的基礎(chǔ)概念和基礎(chǔ)用法詳解
這篇文章主要為大家詳細(xì)介紹了python鏈表的基礎(chǔ)概念和基礎(chǔ)用法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Python連接MySQL數(shù)據(jù)庫(kù)并查找表信息
本文主要介紹了Python連接MySQL數(shù)據(jù)庫(kù)并查找表信息,通過(guò)使用Python中的MySQL Connector模塊,連接到MySQL服務(wù)器并執(zhí)行SQL查詢語(yǔ)句,可以獲取表的結(jié)構(gòu)、列信息、行數(shù)據(jù)等,感興趣的可以了解一下2023-08-08PyCharm+PySpark遠(yuǎn)程調(diào)試的環(huán)境配置的方法
今天小編就為大家分享一篇PyCharm+PySpark遠(yuǎn)程調(diào)試的環(huán)境配置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11python實(shí)現(xiàn)簡(jiǎn)單flappy bird
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單flappy bird小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12探究Python多進(jìn)程編程下線程之間變量的共享問(wèn)題
這篇文章主要介紹了探究Python多進(jìn)程編程下線程之間變量的共享問(wèn)題,多進(jìn)程編程是Python學(xué)習(xí)進(jìn)階中的重要知識(shí),需要的朋友可以參考下2015-05-05