我可以在后台创建一个类运行方法吗?

时间:2014-01-22 13:31:35

标签: python parallel-processing

我想创建一个类似服务器的简单程序,它可以在循环中运行并读取和处理发送给它的消息。当我像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

2 个答案:

答案 0 :(得分: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.Queue(Python3中的Queue.queue)以及线索中的内容,例如Event s,Lock s,Semaphore以及它们对于它们的好处

希望这有帮助!

答案 1 :(得分: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()

为您收到的每封邮件启动一个帖子。无论如何,使用线程池可能会更好。