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



我正在尝试在一个单独的线程中启动斯坦福NLP服务器,并将服务器实例作为参数传递给类run_nlpGrid中定义的方法,这是我的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但这些都不起作用。

我给start_server打电话对吗?或者问题可能出在哪里?

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

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

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

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

最新更新