我有一个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)
答案 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)