解決python線程卡死的問題
1. top命令和日志方式判定卡死的位置
python代碼忽然卡死,日志不輸出,通過如下方式可以確定線程確實(shí)已經(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請求那,所以以后遇到線程卡死的情況,就通過打日志的方式來確定卡死的位置,最終定位到問題確實(shí)是一個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
原因是因?yàn)閠hrift服務(wù)端只啟動了10個服務(wù)進(jìn)程,所以只能同時處理10個請求,而我客戶端打開的thrift連接一直沒有關(guān)閉,所以10個服務(wù)進(jìn)程被10個客戶端連接霸占了,另外5個進(jìn)程獲取不到連接,自然就一直卡住了。
以上這篇解決python線程卡死的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python:批量統(tǒng)計xml中各類目標(biāo)的數(shù)量案例
這篇文章主要介紹了python:批量統(tǒng)計xml中各類目標(biāo)的數(shù)量案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
python使用fcntl模塊實(shí)現(xiàn)程序加鎖功能示例
這篇文章主要介紹了python使用fcntl模塊實(shí)現(xiàn)程序加鎖功能,較為詳細(xì)的分析了fcntl模塊的具體功能并結(jié)合實(shí)例形式給出了Python實(shí)現(xiàn)程序加鎖的操作技巧,需要的朋友可以參考下2017-06-06
Django框架orM與自定義SQL語句混合事務(wù)控制操作
這篇文章主要介紹了Django框架orM與自定義SQL語句混合事務(wù)控制操作,結(jié)合實(shí)例形式分析了同一個方法里面既有ORM又有自定義SQL 語句的情況下事務(wù)控制相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
Python在Windows環(huán)境下的文件路徑問題及解決辦法
在Python中處理Windows路徑時,經(jīng)常會遇到一些特殊的問題,在Windows中,路徑使用反斜杠(\)作為分隔符,而在其他操作系統(tǒng)中,路徑使用正斜杠(/)作為分隔符,本文給大家介紹了Python在Windows環(huán)境下的文件路徑問題及解決辦法,需要的朋友可以參考下2024-06-06
在服務(wù)器端實(shí)現(xiàn)無間斷部署Python應(yīng)用的教程
這篇文章主要介紹了在服務(wù)器端實(shí)現(xiàn)無間斷部署Python應(yīng)用的教程,方法主要是Gunicorn進(jìn)行重載,需要的朋友可以參考下2015-04-04
利用Python通過商品條形碼查詢商品信息的實(shí)現(xiàn)示例
這篇文章主要介紹了利用Python通過商品條形碼查詢商品信息,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Python中的自定義函數(shù)學(xué)習(xí)筆記
這篇文章主要介紹了Python中的自定義函數(shù)學(xué)習(xí)筆記,本文講解了定義函數(shù)、callable函數(shù)、help函數(shù)等內(nèi)容,需要的朋友可以參考下2014-09-09

