如何在Nameko中实现异步RPC调用?代码语法错误求助
解决Nameko异步RPC调用的语法错误问题
你碰到的这个语法错误其实很好解决——问题出在两点:一是async是Python的关键字,不能直接作为方法名放在.后面调用;二是Nameko的异步RPC调用有专门的调用方式,不是用.async()这种写法的。
错误原因
你尝试用self.task_runner.start.async(...)发起异步调用,但在Python语法里,关键字不能作为属性/方法名使用,这直接导致了语法报错。
正确写法
Nameko为RpcProxy生成的方法提供了call_async()方法来发起异步RPC请求,调用后会立即返回,不会阻塞等待目标服务的响应。修改后的代码如下:
from nameko.rpc import rpc, RpcProxy class Scheduler(object): name = "scheduler" task_runner = RpcProxy('task_runner') @rpc def schedule(self, task_type, group_id, time): # 使用 call_async 发起异步RPC调用,无需等待回复 self.task_runner.start.call_async(task_type, group_id) # 如果你需要返回一个标识(比如异步任务的ID),也可以返回AsyncResult对象 # return self.task_runner.start.call_async(task_type, group_id)
补充说明
call_async()方法会将RPC请求发送到RabbitMQ后,立即返回一个AsyncResult对象。如果你不需要后续查询任务状态或结果,完全可以省略return语句,直接调用即可,这样你的schedule方法会立刻返回,完全符合你“发起RPC后无需等待回复”的需求。- 因为你用RabbitMQ作为消息队列,异步调用的请求会被可靠地投递到
task_runner服务的队列中,不用担心请求丢失(只要RabbitMQ正常运行)。
你的错误代码片段:
return self.task_runner.start.async(task_type, group_id)对应的报错信息:
Traceback (most recent call last): File "/home/satnam-sandhu/.anaconda3/envs/etl/bin/nameko", line 8, in <module> sys.exit(main()) File "/home/satnam-sandhu/.anaconda3/envs/etl/lib/python3.8/site-packages/nameko/cli/main.py", line 112, in main args.main(args) File "/home/satnam-sandhu/.anaconda3/envs/etl/lib/python3.8/site-packages/nameko/cli/commands.py", line 110, in main main(args) File "/home/satnam-sandhu/.anaconda3/envs/etl/lib/python3.8/site-packages/nameko/cli/run.py", line 181, in main import_service(path) File "/home/satnam-sandhu/.anaconda3/envs/etl/lib/python3.8/site-packages/nameko/cli/run.py", line 46, in import_service __import__(module_name) File "./scheduler/service.py", line 15 return self.task_runner.start.async(task_type, group_id) ^ SyntaxError: invalid syntax
内容的提问来源于stack exchange,提问作者Satnam Sandhu
相关产品推荐
相关产品推荐

