我正在开发一个服务器(守护进程)。
服务器有一个“工作线程”。工作线程运行命令队列。当队列为空时,工作线程暂停(但不会退出,因为它应该在内存中保留某些状态)。要在内存中只有一个状态副本,我需要一次运行一个(而不是几个而不是零)工作线程。
当客户端连接到Unix套接字并发送命令时,请求将添加到此队列的末尾。
发出命令后,它将被添加到工作线程的命令队列中。将其添加到队列后,服务器会回复“OK”之类的内容。服务器接收命令和“OK”回复之间应该没有长时间停顿。但是,在队列中运行命令可能需要一些时间。
工作线程的主要“工作”被分成小块(占用相对较少的时间)块。在块之间,工作线程检查(“吃掉”并清空)队列,并根据从队列中提取的数据继续工作。
如何在Python中实现此服务器/守护程序?
答案 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()