Запуск экземпляра сервера в отдельном потоке не передает объект сервера методу - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь запустить сервер Stanford NLP в одном отдельном потоке и передать экземпляр сервера в качестве параметра методу run_nlp, определенному в классе Grid, который является классом макета для моего приложения Python.

from readUseCase import parser
...
...
class Grid(Widget):
    text_from_file = ObjectProperty(None)
    client = ObjectProperty(None)

    def start_server(self):
        with CoreNLPClient(properties='./server.props') as self.client:
            pass

    def run_nlp(self):
        parser(self.client, self.text_from_file.text)

class Main(App):
    def build(self):
        thread1 = threading.Thread(target=Grid().start_server)
        thread1.start()
        return Grid()

if __name__ == '__main__':
    Main().run()

Итак, что происходит, я запускаю приложение, thread запускается, консоль распечатывает, что сервер запущен, мое приложение также запущено и ожидает некоторого пользовательского ввода. Но когда я ввожу некоторый текст для NLP и нажимаю кнопку для запуска метода run_nlp(), функции parser() нужны 2 входных параметра, первый - это объект сервера, а второй - вводимый текст.

Анализатор функции:

def parser(client, text):

    # submit the request to the server
    ann = client.annotate(text)      //AttributeError("NoneType" object has no attribute "annotate")

Я получаю правильное значение в параметре self.text_from_file.text, но я получаю NoneType для параметра self.client, и я не знаю почему. Я пытался присвоить его какой-то другой переменной или return self.client, но ничего из этого не работает.

Я называю start_server верно? Или где может быть проблема?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Разве ваш контекстный менеджер только начинается и завершает работу? Если содержимое тела pass, тогда менеджер контекста немедленно завершит работу и очистит сервер.

0 голосов
/ 28 октября 2019

Возможно, это связано с тем, что вы создаете два объекта типа Grid в методе build. Один используется для запуска потока, но другой создается и возвращается. Я думаю, вы должны изменить свой код на что-то вроде этого:

class Main(App):
    def build(self):
        grid = Grid()
        thread1 = threading.Thread(target=grid.start_server)
        thread1.start()
        return grid

Другая проблема может заключаться в том, что клиент не установлен ни в одной точке. Я не знаю эту библиотеку, но убедитесь, что вы все правильно настроили.

...