套接字服务器同时从客户端套接字响应多个请求

时间:2017-06-05 05:50:04

标签: python multithreading sockets concurrency queue

我正在使用Python构建套接字服务器。

此服务器

  1. 从客户
  2. 接收数据
  3. 在这里做了一些事情(大约需要大约10秒,具体取决于输入数据)
  4. 在完成上述一些工作后发回数据
  5. 除非客户端不连续同时发送数据,否则此系统工作正常。例如,假设服务器需要5秒钟来处理数据,而客户端每10秒钟发送一次数据。然而,问题是客户端一次发送多个请求,从而导致延迟。目前,客户端无法向服务器发送数据,除非服务器已准备好接收数据,这意味着服务器没有做任何工作。以下是我想要构建的内容。

    • a)在套接字服务器上构建一个队列,其主要任务是建立一个输入数据队列,以便即使服务器忙,客户端也可以向服务器发送数据
    • b)在套接字服务器上创建一个线程(这里,我有点混淆并发性和并行性。在socket中专注于计算而不是系统调用),以便服务器可以“同时”工作。
    • c)将数据发送回客户端套接字

    我的问题如下。

    1. 是否需要使用队列来实现a)?
    2. 是否需要使用线程或其他东西来实现b)?
    3. 提前致谢

      最佳

1 个答案:

答案 0 :(得分:1)

是的,这样的事情可行。

首先,您需要一个线程来接收和发送数据。如果您的客户端数量有限,则可以为每个客户端创建一个线程,但对于一个或多或少强大的系统而言,它不是一个选项。为了能够在单个线程中为多个客户端提供服务,套接字应该是 nonblocking 。否则,一个长传输将阻止其他传输。非阻塞代码具有使用select的更复杂的结构,因此我建议花一些时间阅读它。

然后你需要一个线程来做数学运算。或者如果“数学”需要很长时间才能执行,可以使用几个线程/进程。

最后但并非最不重要的是,这些套接字线程和“数学”线程应该使用两个队列来交换数据。简单的lists就足够了,但要确保它们同步。用互斥锁或锁来保护它们。这是另一个值得一读的大话题。