从Java启动CherryPy会导致没有响应的答案
我有一个Python项目,为此我创建了一个CherrypyWebService包装器,以便通过Java客户机(特别是一个自行开发的Eclipse插件)访问它。CherryPy服务器也是作为外部进程从Java启动的:从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
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)