Tornado 协程因 'dict' 对象不可调用而失败
Tornado Coroutine fails with 'dict' object not callabale
Python版本:3.6
我不是Python方面的超级专家,我正在尝试使用Tornado 实现一个简单的REST 服务器并使用非阻塞协程调用阻塞函数。当我从阻塞函数中 return Json 时,它失败并显示 TypeError: 'dict' object is not callable
这是代码
@gen.coroutine
def post(self):
jsonResponse = yield self.process_request(imageBytes)
self.write(json.dumps(jsonResponse))
@gen.coroutine
def process_request(self, imageBytes):
response = yield (executor.submit(self.test_func(), None))
return response
def test_func(self):
print('test func')
time.sleep(1)
jsonDataSet = {"text": "hello 123"}
return jsonDataSet
我不确定我做错了什么,请按照 Tornado 参考中的示例代码进行操作。任何指示都会有帮助吗?
最新:
我转向异步并等待,现在我得到 "'coroutine' 类型的对象不是 JSON 可序列化的"
async def test_func():
print('test func')
time.sleep(1)
jsonDataSet = {"text": "hello 123"}
return jsonDataSet
#return "test"
response = await `tornado.ioloop.IOLoop.current().run_in_executor(None, test_func)`
TypeError: 'dict' object is not callable
executor.submit()
需要可调用函数,但您已经在调用 test_func
函数。当您调用 test_func()
时,您实际上是将其 return 值(这是一个字典)传递给 submit()
函数。
你需要传递这个函数而不调用:
executor.submit(self.test_func, None)
Latest: I moved to async & await now I am getting "Object of type 'coroutine' is not JSON serializable"
run_in_executor
用于 运行 单独线程中的普通函数。它不适用于 运行 协程。
这里发生的事情是 run_in_executor
正在调用 test_func()
协同程序,它会自动 returns 一个等待对象(因为它是一个协同程序)。
如果你想使用run_in_executor
执行test_func
,只需将其设为普通函数即可(不要使用async def
)。
Python版本:3.6
我不是Python方面的超级专家,我正在尝试使用Tornado 实现一个简单的REST 服务器并使用非阻塞协程调用阻塞函数。当我从阻塞函数中 return Json 时,它失败并显示 TypeError: 'dict' object is not callable 这是代码
@gen.coroutine
def post(self):
jsonResponse = yield self.process_request(imageBytes)
self.write(json.dumps(jsonResponse))
@gen.coroutine
def process_request(self, imageBytes):
response = yield (executor.submit(self.test_func(), None))
return response
def test_func(self):
print('test func')
time.sleep(1)
jsonDataSet = {"text": "hello 123"}
return jsonDataSet
我不确定我做错了什么,请按照 Tornado 参考中的示例代码进行操作。任何指示都会有帮助吗?
最新: 我转向异步并等待,现在我得到 "'coroutine' 类型的对象不是 JSON 可序列化的"
async def test_func():
print('test func')
time.sleep(1)
jsonDataSet = {"text": "hello 123"}
return jsonDataSet
#return "test"
response = await `tornado.ioloop.IOLoop.current().run_in_executor(None, test_func)`
TypeError: 'dict' object is not callable
executor.submit()
需要可调用函数,但您已经在调用 test_func
函数。当您调用 test_func()
时,您实际上是将其 return 值(这是一个字典)传递给 submit()
函数。
你需要传递这个函数而不调用:
executor.submit(self.test_func, None)
Latest: I moved to async & await now I am getting "Object of type 'coroutine' is not JSON serializable"
run_in_executor
用于 运行 单独线程中的普通函数。它不适用于 运行 协程。
这里发生的事情是 run_in_executor
正在调用 test_func()
协同程序,它会自动 returns 一个等待对象(因为它是一个协同程序)。
如果你想使用run_in_executor
执行test_func
,只需将其设为普通函数即可(不要使用async def
)。