编写将任务排队的服务器



我正在用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

据我所知,如果我让服务器接收客户端的请求,执行它并做出响应,这可能会同时发生在不同的线程中。我只想让一个线程执行所有任务(因为我预计会有很多任务进入,如果每个人都同时运行一个,那会很慢)。我该如何做到这一点?

有很多方法可以对其进行剥皮,但解决方案如下所示:

客户端->客户端中介器(TCP端口)<-->服务器中介->(ServerQ)<-任务流程

流程如下:

客户流程:

  1. 客户端在tcp套接字上创建一个客户端中介
  2. 通过端口发送所需的任何信息
  3. 服务器中介接收请求
    1. 为任务流程创建响应Q
    2. 将请求放置在服务器Q上(命令+响应Q)
  4. 等待响应Q的响应
    1. X时间超时后没有响应
    2. 一旦收到响应,就通过tcp端口读取并发送响应

服务器进程:

  1. 从服务器Q读取。
    1. 进程命令
    2. 将响应写入响应Q

涉及的组件

客户端-发送任务完成请求的简单过程。

客户端中介-创建到服务器进程的连接。

服务器中介-接受客户端的任务处理请求,将任务排入队列并等待响应。

任务进程-从ServerQ读取并等待任务进入。

好吧,Nix说的是对的,但我不确定如何做到这一点(我的问题是如何真正实现这一点)

事实证明,我必须启动两个线程:一个从队列执行,另一个是主服务器处理程序。服务器处理程序为每个新连接生成线程,如果请求成功排队,则客户端会在发送请求后阻塞。这意味着队列需要使用信号量或互斥对象来实现线程安全/保护。在python的情况下,存在多处理。为您处理该问题的队列类。每当执行任务时,执行线程都会执行notifyAll(),这会导致所有睡眠线程醒来,并检查它们请求的任务是否完成。我使用了一个条件变量。

最新更新