2012-02-16 199 views
-1

我有一個產生線程的服務。 而我可能會在我使用的代碼中泄漏資源。
我有類似的Python代碼,使用線程在python線程死亡時?

import threading 

class Worker(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
    def run(self): 
     # now i am using django orm to make a query 
     dataList =Mydata.objects.filter(date__isnull = True)[:chunkSize] 
     print '%s - DB worker finished reading %s entrys' % (datetime.now(),len(dataList)) 

while True: 
    myWorker = Worker() 
    mwWorker.start() 
    while myWorker.isalive(): # wait for worker to finish 
     do_other_work() 

是它好嗎?
線程會在完成執行run方法時死掉嗎?
我是否會造成資源泄漏?

+0

*「我可能有資源的泄漏」 *是什麼讓你這麼認爲? – 2012-02-16 09:01:48

+1

不要忘了'加入'線程 – 2012-02-16 09:11:45

+0

什麼讓我覺得我有一個泄漏是這個 - http://stackoverflow.com/questions/9292567/operationalerror-2001-cant-create-unix-socket-24 – yossi 2012-02-16 09:14:52

回答

2

看着你previous question(您在評論LINKD)的問題是,你運行了文件描述符的。

official doc

文件描述符是對應於已經被當前進程打開的文件小整數。例如,標準輸入通常是文件描述符0,標準輸出是1,標準錯誤是2.然後爲進程打開的其他文件將分配3,4,5等等。名稱「文件描述符」有點欺騙性;在Unix平臺上,套接字和管道也被文件描述符引用。

現在,我猜,但它可能是你正在做的是這樣的:

class Wroker(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
    def run(self): 
     my_file = open('example.txt') 
     # operations 
     my_file.close() # without this line! 

您需要關閉您的文件!

您可能會啓動多個線程,並且每個線程都打開但沒有關閉文件,這種方式經過一段時間後,您沒有更多的「小整數」來分配用於打開新文件。

另請注意,在#operations部分中可能會發生任何情況,如果拋出異常,除非包含在try/finally語句中,否則文件將不會關閉。

有用於處理文件的一種更好的方式:在with statement

with open('example.txt') as my_file: 
    # bunch of operations with the file 
# other operations for which you don't need the file 
+0

我我沒有打開(..)我正在做一個MySQL查詢使用django - dataList = Mydata.objects.filter(date__isnull = True)[:chunkSize] 打印'%s - 數據庫工人完成閱讀%s entrys'%(日期時間。現在(),len(dataList)) – yossi 2012-02-16 10:01:50

+0

@yossi:在你的例子中,你只是做一個簡單的'print',而且這樣做絕對不會泄漏任何東西,所以你應該用你的真實/僞代碼更新你的問題,否則它很難告訴發生了什麼事。 – 2012-02-16 10:19:07

+0

你是對的,我編輯它。 – yossi 2012-02-16 10:49:27

1

創建線程對象後,必須通過調用線程的start()方法來啓動它的活動。這會在一個單獨的控制線程中調用run()方法。 一旦線程的活動開始,線程被認爲是'活着'。 它的run()方法終止時會停止活動 - 正常情況下或通過引發未處理的異常。 is_alive()方法測試線程是否處於活動狀態。

python site