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

时间:2016-09-20 15:24:46

标签: python sockets server daemon

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

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

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

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

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

如何在Python中实现此服务器/守护程序?

1 个答案:

答案 0 :(得分:1)

这是一个带有互联网套接字的示例代码,可以轻松替换为unix域套接字。它接受你写入套接字的任何内容,将其作为“命令”传递给worker,一旦命令排队就响应OK。单个工作人员通过睡眠模拟冗长的任务(30)。您可以根据需要排队任意数量的任务,立即接收OK,每30秒,您的工作人员从队列中打印一个命令。

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()