在生产中的 Web 服务器中使用 sleep() 是一种不好的做法吗?

Xar*_*Xar 3 python django

我正在使用 Django1.8 和 Python2.7。

在项目的某个部分,我打开一个套接字并通过它发送一些数据。由于另一端的工作方式,我需要在发送的每个数据之间留出一些时间(假设为 10 毫秒):

   while True:
       send(data)
       sleep(0.01)
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:简单地sleep()用来创建暂停是否被认为是一种不好的做法?也许还有其他更有效的方法?

更新:我需要创建暂停的原因是因为套接字的另一端是一个外部服务,需要一些时间来处理我发送的数据块。我还应该指出,它在接收或处理数据后不会返回任何内容。离开那个短暂的停顿可以确保我发送的每个数据块都被接收器正确处理。

编辑:将睡眠更改为 0.01。

Jon*_*sco 5

是的,这是不好的做法和反模式。您将在未知时间段内占用正在处理此请求的“工作人员”,这将使其无法为其他请求提供服务。Web 应用程序的经典模式是尽可能快地为请求提供服务,因为通常有固定或最大数量的并发工作人员。虽然这个工人不断地在工作sleep,但它实际上是在池外。如果多个请求到达此端点,则多个工作线程会被占用,因此应用程序的其余部分将遇到瓶颈。除此之外,您还有数据库锁或竞争条件的潜在问题。

处理您的情况的标准方法是使用像Celery这样的任务队列。您的 Web 应用程序会告诉Celery启动任务,然后快速完成请求逻辑。 Celery然后将处理与第 3 方服务器的通信。 DjangoCelery 配合得非常好,有很多教程可以帮助你解决这个问题。

如果您需要向最终用户提供信息,那么您可以为任务生成一个唯一的 ID,并通过让客户端经常刷新 URL 来轮询结果后端以进行更新。(我认为Celery会自动生成一个 guid,但我通常会指定一个。)