如何停止Cherrypy中的请求处理?

2024-10-01 15:30:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python2.6,cherrypy3.1

我对请求的超时有一些问题。我只需要在有限时间内完成请求(30秒)。在这个限制之后,应该终止进程并返回答案

服务器正在通过启动树.安装(); 切里皮。开始(); 切里皮·布洛克()

首先。。。当我试图终止应用程序时(按Ctrl+C(debian 6.0)),应用程序被卡住了:

正在等待子线程终止…

如何在退出时终止进程,以及如何处理进程没有响应时killin的超时连接?在

不管怎样,我还是希望有人能解决这个问题。在

你好,马丁


Tags: 答案服务器应用程序进程时间debian线程ctrl
1条回答
网友
1楼 · 发布于 2024-10-01 15:30:16

从CherryPy 12开始,删除_TimeoutMonitor。如果您仍然想尝试下面的方法,请参见the pull request获取其源代码。在


注意。如果不小心将线程或进程作为正常执行流的一部分杀死,很可能会把事情搞砸。如果Python代码exceptfinally无法执行,则会出现内存和同步问题(例如死锁)、未关闭的文件句柄和套接字等等。杀戮可以解决你的问题,就像断头台被称为头皮屑的治疗方法一样。在

在Python中终止线程

一般来说,你做不到。只是没有这样的API。在某些情况下,您可以找到some hacks,但通常无法找到。终止线程的唯一稳定方法是通过标志、事件等与它合作

强制停止切里皮过程

当您在拥有CherryPy Python进程的终端中按Ctrl+C时,解释器接收到SIGINT信号并引发KeyboardInterrupt异常。然后CherryPy命令它的工作线程停止并告诉您等待子线程终止。。。。如果工作线程在用户代码中被阻塞,CherryPy将一直等到它被释放。在

要强制停止,可以使用common kill -9 PID,其中PID是CherryPy进程的进程id。有时,您可以在任何过程监视器中找到它。或者合并^{}来编写进程的pid文件。在

处理可能没有响应的任务

一般来说,CherryPy是一个线程服务器。如果十几秒的响应对于您的任务来说很常见,那么您很容易就用完了工作线程。在这种情况下,后台任务队列可能是个好主意(CeleryRq),或者至少是^{}的一些用法。但它显然会让你重新设计系统,进行临时结果存储、响应轮询或推送。这增加了复杂性,因此决策时应权衡所有利弊。在

如果你可以限制执行的最后进行处理或计算,你最好在那里做。不管是数据库,还是web服务API调用,或者其他什么,然后只处理一个超时异常。在

CherryPy开箱即用响应超时

CherryPy中有现成的响应超时特性。它由^{}配置和{a8}控制,后者在单独的线程中运行,并查看响应是否已超时。虽然实际上监视器只设置一个属性response.timed_out,稍后在cherrypy._cprequest.Request.run中查看,如果是真的,则引发cherrypy.TimeoutError。因此,超时异常在生成后引发。如果页面处理程序阻塞30秒,则只有30秒后才会出现异常。在

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import time

import cherrypy


config = {
  'global' : {
    'server.socket_host' : '127.0.0.1',
    'server.socket_port' : 8080,
    'server.thread_pool' : 8,
    # interval in seconds at which the timeout monitor runs
    'engine.timeout_monitor.frequency' : 1
  },
  '/' : {
    # the number of seconds to allow responses to run
    'response.timeout' : 2
  }
}


class App:

  @cherrypy.expose
  def index(self):
    time.sleep(8)
    print('after sleep')
    return '<em>Timeout test</em>'


if __name__ == '__main__':
  cherrypy.quickstart(App(), '/', config)

强制响应超时

你不能杀死一个线程,但你可以杀死一个进程。如果您无法以任何其他方式控制任务,则可以将执行打包到进程中,并在时间用完时使用监视器将其终止。下面的例子说明了这个想法。在

^{pr2}$

请注意,您不能使用multiprocessing.Queuemultiprocessing.Pipe与工作进程通信,因为当它被终止时,对它们的任何访问都将锁定CherryPy线程。以下是Python文档中对Process.terminate的引用。在

If this method is used when the associated process is using a pipe or queue then the pipe or queue is liable to become corrupted and may become unusable by other process. Similarly, if the process has acquired a lock or semaphore etc. then terminating it is liable to cause other processes to deadlock.

所以,是的,强制超时在技术上是可能的,但这是一种不受鼓励且容易出错的方法。在

相关问题 更多 >

    热门问题