【问题标题】:socket server responding multiple requests simultaneously from a client socket套接字服务器同时响应来自客户端套接字的多个请求
【发布时间】:2017-11-05 20:16:14
【问题描述】:

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

这台服务器

  1. 从客户端接收数据
  2. 在这里做一些事情(大约需要大约 10 秒,具体取决于输入数据)
  3. 在完成上述一些工作后发回数据

除非客户端不连续同时发送数据,否则此系统工作正常。例如,假设服务器需要 5 秒来处理数据,而客户端每 10 秒发送一次数据。然而,问题是客户端一次发送多个请求,从而导致延迟。目前,除非服务器准备好接收数据,否则客户端无法向服务器发送数据,这意味着服务器没有做任何工作。以下是我想要构建的。

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

我的问题如下。

  1. 我需要使用队列来实现 a) 吗?
  2. 我需要使用线程还是其他东西来实现 b)?

提前致谢

最好的

哎呀

【问题讨论】:

  • 您可能会发现使用许多现有的 python 服务器框架之一更容易。
  • thx @pvg 我去看看。
  • 我刚刚看到你的其他评论,这是关于一个 single 客户端的,这进一步简化了这一点。如果您受计算限制并且正在寻找实际的并行性,那么您很可能会想要多处理之类的东西。到目前为止,您所写的内容尚不完全清楚您要完成什么,但几乎可以肯定您不需要从头开始重新发明它。
  • @pvg 我已经构建了多线程套接字服务器,并成功地降低了总计算速度。下一步将是应用多处理以进一步减少计算过程中花费的时间。感谢您的反馈!

标签: python multithreading sockets concurrency queue


【解决方案1】:

是的,这样的东西可以工作。

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

然后你需要一个线程来做数学。或者如果“数学”执行时间很长,则需要多个线程/进程。

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

【讨论】:

  • 谢谢@Vovanrock2002。就我而言,我没有多个客户。我只有一个客户。该“单个”客户端近乎实时地发送多个请求。话虽如此,您的评论仍然有效吗?
  • @GeeYeolNahm 是的,在这种情况下,一个 IO 线程和一个或多个执行线程就可以了。
  • 谢谢@Vovanrock2002。在您的帮助下,我可以成功构建一个套接字服务器!
猜你喜欢
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 2023-03-10
  • 2014-03-10
  • 1970-01-01
  • 2017-02-25
相关资源
最近更新 更多