2014-11-12 1 views
0

У меня есть проект Python, для которого я создал программу CherryPy-Webservice-Wrapper для доступа к ней через Java-Client (в частности, сам разработанный плагин Eclipse). CherryPy-сервер также запускается с Java в качестве внешнего процесса:Запуск программы CherryPy из Java дает ответы на неполадку

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

Чтобы эксплуатировать CherryPy-сервер из Java-клиента, я использую это:

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

Для тестирования я также получить доступ к CherryPy с моим браузером (Google Chrome). Но через некоторое время, с новым запросом CherryPy больше не реагирует, на Java, а также в Chrome (Chrome показывает медленно левое колесо), то есть клиент не получает ответа от CherryPy. Это происходит невоспроизводимым, поэтому я никогда не могу сказать, когда это произойдет. Также это происходит, когда я запускаю CherryPy как внешний процесс с Java. Когда я запускаю CherryPy как «нормальный» сервис, эта проблема не возникает.

My CherryPy-Python-Project имеет много выходов stdout и stderr, может быть, это как-то связано с этим?

Примечание: Переключение в Jython не вариант (потому что мне нужна c_types-библиотека)

+1

http://stackoverflow.com/a/1850713/1914052 – jwalker

ответ

1

В дополнении к jwalker's comment о буфере STDOUT - может попробовать трубопроводы STDOUT и STDERROR в/DEV/нуль, что в новом версии Баш будет:

python mycherrypyserver.py &> /dev/null 

Я также рекомендовал бы взглянуть на ваши CherryPy сессии, если эта функция включена. Блокировка сеанса может препятствовать тому, чтобы один и тот же клиент мог просматривать другой запрос. См. Здесь: http://blog.schmichael.com/2007/09/20/session-locking-and-performance-in-cherrypy/

0

Чтобы избежать возможного эффекта, на который указывает @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)