Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java启动CherryPy会导致没有响应的答案_Java_Python_Cherrypy_External Process - Fatal编程技术网

从Java启动CherryPy会导致没有响应的答案

从Java启动CherryPy会导致没有响应的答案,java,python,cherrypy,external-process,Java,Python,Cherrypy,External Process,我有一个Python项目,为此我创建了一个CherrypyWebService包装器,以便通过Java客户机(特别是一个自行开发的Eclipse插件)访问它。CherryPy服务器也是作为外部进程从Java启动的: Runtime.getRuntime().exec("python C:/Coding/Projects/p1/CherryPyServer.py " + port); 要从Java客户端操作CherryPy服务器,我使用以下方法: new URL("http://localhos

我有一个Python项目,为此我创建了一个CherrypyWebService包装器,以便通过Java客户机(特别是一个自行开发的Eclipse插件)访问它。CherryPy服务器也是作为外部进程从Java启动的:

Runtime.getRuntime().exec("python C:/Coding/Projects/p1/CherryPyServer.py " + port);
要从Java客户端操作CherryPy服务器,我使用以下方法:

new URL("http://localhost:" + port + "/" + conf).openStream();
为了进行测试,我还使用浏览器(谷歌浏览器)访问CherryPy。但是过了一会儿,在Java和Chrome中,CherryPy不再响应新的请求(Chrome显示一个缓慢向左旋转的轮子),这意味着客户端无法从CherryPy获得答案。这是不可复制的,所以我永远也说不出什么时候会发生。而且,只有当我从Java启动CherryPy作为外部进程时,才会发生这种情况。当我将CherryPy作为“正常”服务启动时,这个问题不会发生

我的CherryPy Python项目有很多stdout和stderr输出,也许这与此有关

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

除了关于标准输出缓冲区之外-可以尝试将标准输出和标准错误管道化到/dev/null,在较新版本的bash中,这将是:

python mycherrypyserver.py &> /dev/null

如果您启用了CherryPy会话,我还建议您查看一下它。会话锁定可能会阻止同一客户端查看另一个请求。请参见此处:

为了避免@jwalker所指的可能影响,您需要停止控制台日志(
log.screen
),这只在您开发时有用。要实现这一点,可以设置apt CherryPy环境,如
CherryPy.config.update({'environment':'production'})
。最好使用你的工具,而不是像@Isa建议的那样与它们对抗

当您看到“左纺车”时,表示CherryPy已收到您的请求,但目前无法处理。如果您使用会话并发送并发请求(如@Isa),它可能是会话锁。但也有可能是Python应用程序使用CherryPy代理时会阻塞,并且因为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)