从Java启动CherryPy会导致无响应答案

时间:2014-11-12 09:00:05

标签: java python cherrypy external-process

我有一个Python-Project,我创建了一个CherryPy-Webservice-Wrapper来通过Java-Client(特别是自行开发的Eclipse插件)访问它。 CherryPy-Server也是从Java作为外部进程启动的:

Runtime.getRuntime().exec("python C:/Coding/Projects/p1/CherryPyServer.py " + port);

要从Java客户端操作CherryPy-Server,我使用:

new URL("http://localhost:" + port + "/" + conf).openStream();

为了进行测试,我还使用浏览器(Google Chrome)访问CherryPy。但过了一段时间,新的请求CherryPy在Java和Chrome中都没有做出反应(Chrome显示了一个缓慢的左转轮),这意味着客户没有得到CherryPy的答案。这种情况不可复制,所以我永远不能说它何时发生。这也只有当我从Java启动CherryPy作为外部进程时才会发生这种情况。当我将CherryPy作为"正常"服务,这个问题不会发生。

我的CherryPy-Python-Project有很多stdout和stderr输出,也许它与它有关?

注意:切换到Jython不是一个选项(因为我需要c_types-library)

2 个答案:

答案 0 :(得分:1)

除了关于STDOUT缓冲区的jwalker's comment之外 - 也许可以尝试将STDOUT和STDERROR传递给/ dev / null,这在较新版本的bash中会是:

python mycherrypyserver.py &> /dev/null

如果您启用了CherryPy会话,我还建议您查看它们。会话锁定可能会阻止同一客户端查看另一个请求。见这里:http://blog.schmichael.com/2007/09/20/session-locking-and-performance-in-cherrypy/

答案 1 :(得分:0)

为了避免@jwalker指向的可能影响,您需要停止控制台日志记录(log.screen),这仅在您开发时有用。为此,您可以设置适合的CherryPy环境,例如cherrypy.config.update({'environment': 'production'})。它总是更好地使用你的工具,而不是像@Isa建议那样对抗它们。

当您看到“左旋轮”时,表示CherryPy已收到您的请求,但此刻无法处理。它可能是一个会话锁,如果你使用会话并发送并发请求,比如@Isa写道。但也可能是您使用CherryPy,块代理您的Python应用程序,并且因为CherryPy是一个线程服务器,您可以使用可用的工作线程。

无论是什么原因,您都可以利用日志记录来了解您的问题。查看访问和错误日​​志以查找与您的请求的对应关系。在Python应用程序启动和结束处理请求时记录条目。你也可以在CherryPy那边做,比如:

#!/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,

    'log.access_file' : 'access.log',
    'log.error_file'  : 'error.log',
  }
}


def logStartFinish(fn):

  def wrap(*args, **kwargs):
    cherrypy.log('Start')
    try:
      return fn(*args, **kwargs)
    finally:
      cherrypy.log('Finish')

  return wrap


class App:

  @cherrypy.expose
  @logStartFinish
  def index(self):
    time.sleep(4) # Call to Python app you wrap
    return 'Some result'


if __name__ == '__main__':
  cherrypy.config.update({'environment': 'production'})
  cherrypy.quickstart(App(), '/', config)