在单独的线程中启动服务器实例不会将服务器对象传递给方法

Starting a server instance in separate thread is not passing server object to method

我正在尝试在一个单独的线程中启动 Stanford NLP 服务器,并将服务器实例作为参数传递给 class Grid 中定义的方法 run_nlp,这是一种布局 class 我的 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 参数中得到正确的值,但我在 self.client 参数中得到 NoneType,这就是我不知道的原因。我试图将它分配给其他一些变量,或者我试图 return self.client 但是 none 这个有效。

我叫 start_server 对吗?或者问题出在哪里?

可能是因为你在build方法中创建了两个Grid类型的对象。一个用于启动线程,但另一个用于创建并返回。我认为您应该将代码更改为如下内容:

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

另一个问题可能是,客户端未设置。我不知道这个库,但请确保您正确设置了所有内容。

您的上下文管理器不是刚刚开始和完成吗?如果正文的内容是 pass 那么上下文管理器将立即完成并清理服务器。