2014-01-22 132 views
3

我想製作一個簡單的類似服務器的程序,它可以循環運行並讀取並處理髮送給它的消息。當我開始像Server().start它顯然永遠循環運行。有沒有辦法在後臺運行它,並用數據提供它,這將會繼續?我可以使背景中的類運行一種方法嗎?

class Server: 
    def __init__(self): 
     self.messages = [] 
     self.running = False  

    def start(self): 
     self.running = True 
     self.work() 

    def send_mess(self, message): 
     self.messages.append(message) 

    def handle_mess(self): 
     for mess in self.messages: 
      self.do_calculations(mess)   

    def work(self): 
     while self.running: 
      self.handle_mess(self) 
      self.do_some_important_stuff() 

    def do_some_important_stuff(): 
     pass 
    def do_calculations(): 
     pass 

回答

3

似乎可以使用Thread class from the threading module

它通過繼承它,並重新定義run方法。然後,您發出obj.start(),您將使start方法並行運行。

粗略地說,你的類可以這樣定義(我做了一些更正一些方法來運行)

import threading 

class Server(threading.Thread): 
    def __init__(self): 
     super(Server, self).__init__() 
     self.messages = [] 
     self.running = False  

    def run(self): # changed name start for run 
     self.running = True 
     self.work() 

    def send_mess(self, message): 
     self.messages.append(message) 

    def handle_mess(self): 
     for mess in self.messages: 
      self.do_calculations(mess)   

    def work(self): 
     while self.running: 
      self.handle_mess() 
      self.do_some_important_stuff() 

    def do_some_important_stuff(self): 
     pass 
    def do_calculations(self): 
     pass 


s = Server() 
s.start() # now is in another another thread running 
s.join()  # wait for it to finnish 

重要:複製@Alfe評論,我發現非常有用:

必須指出的是,通過輸入併發世界(螺栓擰緊)一個打開的蠕​​蟲討厭即可。 OP,你真的應該多讀一點關於並行環境中發生的併發問題。否則,你必然遲早會遇到一個嚴重的問題,你不知道如何解決。看到您懂得Queue.QueueQueue.queue在Python3)和東西像穿Event S,Lock S,Semaphore S和他們是很好的東西。

希望這有助於!

+4

一個_MUST_指出,通過輸入併發世界(螺栓擰緊)一個打開的蠕​​蟲討厭即可。 OP,你真的應該多讀一點關於並行環境中發生的併發問題。否則,你必然遲早會遇到一個嚴重的問題,你不知道如何解決。看到你已經理解了'Queue.Queue'(Python3中的'Queue.queue')和''''''''''''事件'''鎖'''信號燈'以及它們的優點。 – Alfe

+1

@Alfe Word!.... –

+0

這幫了很大忙。謝謝。 – user2737120

2

一個簡單的方法是:

def start(self): 
    self.running = True 
    thread = Thread(target = self.work, args =()) 
    thread.start() 

要開始只是一個後臺線程(另一種方式是擴展threading.Thread類)。 或者:

def work(self): 
    while self.running: 
     message = self.handle_mess(self) # gets a message 
     def threaded_part(m): 
      self.do_some_important_stuff(m) 
      self.do_other_important_stuff(m) 
     thread = Thread(target = threaded_part, args = (message)) 
     thread.start() 

要開始爲您收到的每封郵件線程。無論如何,有了線程池,它可能會更好。

相關問題