我想创建一个类似服务器的简单程序,它可以在循环中运行并读取和处理发送给它的消息。当我像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
答案 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()
为您收到的每封邮件启动一个帖子。无论如何,使用线程池可能会更好。