在单独的线程中启动服务器实例不会将服务器对象传递给方法
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
那么上下文管理器将立即完成并清理服务器。
我正在尝试在一个单独的线程中启动 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
那么上下文管理器将立即完成并清理服务器。