Как сделать вызовы RPC асинхронными в nameko?

Я использую nameko для создания конвейера ETL с микросервисной архитектурой, и я не хотите ждать ответа после выполнения запроса 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):
     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

Я новичок в микросервисах и Nameko, а также использую RabbitMQ в качестве службы очередей.


person Satnam Sandhu    schedule 30.12.2019    source источник


Ответы (2)


У меня такая же проблема; вам нужно заменить метод async на метод call_async и получить данные с помощью result().

Документация
проблема с GitHub

person Paulo    schedule 30.12.2019
comment
Привет, @Paulo, твой ответ был правильным, но я чувствую, что если ты немного обновишь ответ, объяснив причину, по которой он был изменен, тогда ответ будет казаться немного более полным, и я приму ответ. - person Satnam Sandhu; 31.12.2019

используйте call_async вместо async или для лучшего результата используйте событие

из nameko.events импортировать EventDispatcher, event_handler

@event_handler("service_a", "event_emit_name")
    def get_result(self, payload):
      #do_something...

и в другом сервисе

from nameko.events import EventDispatcher, event_handler
@event_handler("service_a", "event_emit_name")
    def return_result(self, payload):
       #get payload and work over there
person vijay    schedule 28.02.2020