我在python中编写一个服务器,需要从客户端接收请求,对请求进行排队,一次执行一个请求,然后告诉客户端他们的特定请求已被处理。
目前我接触它的方式是使用TCP套接字服务器 - 但是,我不知道如何制作它以便一次只能从队列中执行一个请求?
我希望它的样子:
Client1 -> (a) -> Server
Client2 -> (b) -> Server
Client3 -> (c) -> Server
Server makes queue |a, b, c|
Execute a first. Done? Tell Client 1
Execute b second. Done? Tell Client 2
Execute c third. Done? Tell Client 3
据我所知,如果我让服务器收回客户端的请求,执行它并做出响应,这可能会在不同的线程中同时发生。我只希望一个线程执行所有任务(因为我预计会有很多任务进入,如果每个人同时运行一个任务,它会很慢)。我该如何做到这一点?
答案 0 :(得分:3)
有很多方法可以实现它,但解决方案看起来如下所示:
客户 - >客户端介体(TCP端口)< - >服务器中介 - > (ServerQ)< - 任务流程
流程将是这样的:
客户流程:
服务器流程:
涉及的组件
客户端 - 发送完成任务请求的简单流程。
Client-Mediator - 创建与服务器进程的连接。
Server-Mediator - 接受客户端请求任务处理,排队任务并等待响应。
任务流程 - 从ServerQ读取并等待任务进入。
答案 1 :(得分:0)
好的,尼克斯说的是对的,但我不确定如何让这一切确实发生(我的问题是如何实际制作这个)
事实证明我必须启动2个线程:一个从队列执行,另一个是主服务器处理程序。服务器处理程序为每个新连接生成线程,并且在发送请求之后客户端阻塞/如果请求成功排队。这意味着队列需要使用信号量或互斥锁进行线程安全/保护。在python的情况下,有一个multiprocessing.Queue类可以为您处理。每当执行任务时,执行线程都会执行notifyAll(),这会导致所有休眠线程被唤醒并检查其请求的任务是否完成。我为此使用了一个条件变量。