编写一个排队任务的服务器

时间:2011-06-08 17:43:02

标签: sockets tcp queue

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

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

2 个答案:

答案 0 :(得分:3)

有很多方法可以实现它,但解决方案看起来如下所示:

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

流程将是这样的:

客户流程:

  1. 客户端在tcp套接字上创建客户端介体。
  2. 通过端口发送所需的任何信息。
  3. Server Mediator收到请求
    1. 为任务流程
    2. 创建响应Q.
    3. 将请求放在Server Q(命令+ responseQ)
  4. 等待responseQ的回复
    1. X时间超时后没有响应?
    2. 响应到来后,通过tcp端口读取并发送响应。
  5. 服务器流程:

    1. 从服务器Q读取。
      1. 处理命令
      2. 将回复写回响应Q

    2. 涉及的组件

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

      Client-Mediator - 创建与服务器进程的连接。

      Server-Mediator - 接受客户端请求任务处理,排队任务并等待响应。

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

答案 1 :(得分:0)

好的,尼克斯说的是对的,但我不确定如何让这一切确实发生(我的问题是如何实际制作这个)

事实证明我必须启动2个线程:一个从队列执行,另一个是主服务器处理程序。服务器处理程序为每个新连接生成线程,并且在发送请求之后客户端阻塞/如果请求成功排队。这意味着队列需要使用信号量或互斥锁进行线程安全/保护。在python的情况下,有一个multiprocessing.Queue类可以为您处理。每当执行任务时,执行线程都会执行notifyAll(),这会导致所有休眠线程被唤醒并检查其请求的任务是否完成。我为此使用了一个条件变量。