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)。