我正在开发一个服务器(守护进程)。
服务器有一个"工作线程"。工作线程运行一个命令队列。当队列为空时,工作线程暂停(但不退出,因为它应该在内存中保留某些状态)。为了在内存中只有一个状态副本,我需要始终运行一个(不是几个,也不是零)工作线程。
当客户端连接到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()