2013-03-12 125 views
31

我目前正在學習Python和類,我有一個基本問題,但我沒有找到任何答案。比方說,我有這個虛擬類在線程中運行類方法(python)

class DomainOperations: 
    def __init__(self, domain): 
     self.domain = domain 
     self.domain_ip = '' 
     self.website_thumbnail = '' 

    def resolve_domain(self): 
     #resolve domain to ipv4 and save to self.domain_ip 

    def generate_website_thumbnail(self): 
     #generate website thumbnail and save the url to self.website_thumbnail 

我要同時運行resolve_domain和generate_website_thumbnail當線程完成我想要打印的IP和縮略圖。

編輯:我知道我應該使用線程,也許這樣的事情

r = DomainOperations('google.com') 

t1 = threading.Thread(target=r.resolve_domain) 
t1.start() 

t2 = threading.Thread(target=r.generate_website_thumbnail) 
t2.start() 

但我應該使用它們的類之外?我應該寫另一個類來處理線程嗎?

什麼是正確的方法要做到這一點?

回答

52

如果你從類打電話給他們,這是非常簡單:

import threading 

class DomainOperations: 

    def __init__(self): 
     self.domain_ip = '' 
     self.website_thumbnail = '' 

    def resolve_domain(self): 
     self.domain_ip = 'foo' 

    def generate_website_thumbnail(self): 
     self.website_thumbnail= 'bar' 

    def run(self): 
     t1 = threading.Thread(target=self.resolve_domain) 
     t2 = threading.Thread(target=self.generate_website_thumbnail) 
     t1.start() 
     t2.start() 
     t1.join() 
     t2.join() 
     print(self.domain_ip, self.website_thumbnail) 

if __name__ == '__main__': 
    d = DomainOperations() 
    d.run() 
+5

-1:您可以運行一個類中的線程,但表示線程不會繼承「自我」的命名空間。所以基本上沒有你不能。有點重要的信息 – 2014-04-04 18:38:10

+0

@ jasondancks我很抱歉,但你錯了。看看下面的例子:http://pastebin.com/8JWzReCW。 'self.resolve_domain'和'self.generate_website_thumbnail'將使用對象屬性,因爲'self'是兩個調用的第一個參數。 – 2014-04-04 20:45:16

+1

呵呵。我今天無法在我的代碼中使用它,所以我必須將我的方法帶出課程並將該對象作爲參數傳遞。我道歉。 – 2014-04-04 22:21:03