2010-10-10 177 views
1

我正在使用Python 2.x編寫更新應用程序。我有一個線程(ticket_server)在longpoll模式下坐在數據庫(CouchDB)url上。更新請求從外部應用程序轉儲到此數據庫中。當發生變化時,ticket_server會觸發一個工作線程(update_manager)。繁重的工作是在這個update_manager線程中完成的。將會執行telnet連接和ftp上傳。所以這個過程最重要的是不要中斷。Python,是否適合一個線程產生另一個線程

我的問題是,從ticket_server線程產生update_manager線程安全嗎?

另一個選項可能是將請求放入隊列中,並讓另一個函數等待票證進入隊列,然後將請求傳遞給update_manager線程。但是,Id寧願簡單(我假設ticket_server派生update_manager是簡單的),直到我有一個理由擴大。

# Here is the heavy lifter 
class Update_Manager(threading.Thread): 
    def __init__(self) 
     threading.Thread.__init__(self, ticket, telnet_ip, ftp_ip) 
     self.ticket = ticket 
     self.telnet_ip = telnet_ip 
     self.ftp_ip = ftp_ip 


    def run(self): 
     # This will be a very lengthy process. 
     self.do_some_telnet() 
     self.do_some_ftp() 

    def do_some_telnet(self) 
     ... 

    def do_some_ftp(self) 
     ... 

# This guy just passes work orders off to Update_Manager 
class Ticket_Server(threading.Thread): 
    def __init__(self) 
     threading.Thread.__init__(self, database_ip) 
     self.database_ip 

    def run(self): 
     # This function call will block this thread only. 
     ticket = self.get_ticket(database_ip) 

     # Here is where I question what to do. 
     # Should I 1) call the Update thread right from here... 
     up_man = Update_Manager(ticket) 
     up_man.start 

     # Or should I 2) put the ticket into a queue and let some other function 
     # not in this thread fire the Update_Manager. 


    def get_ticket() 
    # This function will 'wait' for a ticket to get posted. 
    # for those familiar with couchdb: 
     url = 'http://' + database_ip:port + '/_changes?feed=longpoll&since=' + update_seq 
     response = urllib2.urlopen(url) 

這僅僅是大量的代碼要問哪種方法更安全/更高效/更Python 我只是在舊有蟒蛇幾個月所以這些問題讓我的大腦停留在一個while循環。

回答

3

程序主線程一個線程;產生一個線程的唯一方法是從另一個線程。

當然,您需要確保您的阻塞線程在等待時釋放GIL,否則其他Python線程將無法運行。所有成熟的Python數據庫綁定都會這樣做,但我從來沒有聽說過couchdb。

+1

couchdb是那些新穎的「面向對象的數據庫」之一。 – Arafangion 2010-10-11 01:18:12

+2

@Arafangion,或許我們應該在誤導那些沒有聽說過couchdb的人之前檢查'它不是什麼'「。 – sbartell 2010-10-11 01:51:15

+0

@Glenn,我應該舉幾個例子來更好地說明我的問題。 – sbartell 2010-10-11 01:53:27

相關問題