实现单线程服务器/守护进程(Python)



我正在开发一个服务器(守护进程)。

服务器有一个"工作线程"。工作线程运行一个命令队列。当队列为空时,工作线程暂停(但不退出,因为它应该在内存中保留某些状态)。为了在内存中只有一个状态副本,我需要始终运行一个(不是几个,也不是零)工作线程。

当客户端连接到Unix套接字并发送命令时,请求被添加到该队列的末尾。

命令发出后,它被添加到工作线程的命令队列中。将它添加到队列后,服务器会回复类似"OK"的内容。在服务器接收命令和"OK"回复之间不应该有很长的停顿。但是,在队列中运行命令可能需要一些时间。

工作线程的主要"工作"被分成小块(占用相对较少的时间)。在数据块之间,工作线程检查("吃掉"并清空)队列,并根据从队列中提取的数据继续工作。

如何在Python中实现这个服务器/守护进程?

这是一个带有internet套接字的示例代码,很容易替换为unix域套接字。它接受您写入套接字的任何内容,将其作为"命令"传递给worker,并在命令排队后立即响应OK。单个工人模拟长时间的睡眠任务(30)。您可以将任意多的任务排队,立即接收OK,并且每隔30秒,您的worker从队列中打印一条命令。

import Queue, threading, socket
from time import sleep
class worker(threading.Thread):
    def __init__(self,q):
        super(worker,self).__init__()
        self.qu = q
    def run(self):
        while True:
            new_task=self.qu.get(True)
            print new_task
            i=0
            while i < 10:
                print "working ..."
                sleep(1)
                i += 1
                try:
                    another_task=self.qu.get(False)
                    print another_task
                except Queue.Empty:
                    pass          
task_queue = Queue.Queue()
w = worker(task_queue)
w.daemon = True
w.start()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 4200))
sock.listen(1)
try:
    while True:
        conn, addr = sock.accept()
        data = conn.recv(32)
        task_queue.put(data)
        conn.sendall("OK")
        conn.close()
except:
    sock.close()

最新更新