Zerorpc асинхронные вызовы - PullRequest
0 голосов
/ 14 апреля 2019

Сервер

Предположим, у меня есть следующий сервер zerorpc

#server side
import zerorpc

class API():

    def long_running_task(self):
        print('1 - started long_running_task')
        #for instance a long running SQL query
        zerorpc.gevent.sleep(10)
        print('2 - finished long_running_task')

    def other_task(self):
        print('1 - started other_task')
        pass
        print('2 - finished other_task')

s = zerorpc.Server(API())
s.bind("tcp://0.0.0.0:4444")
zerorpc.gevent.spawn(s.run)
while True:
    zerorpc.gevent.sleep(10)

Клиент

и клиентское приложение, которое отправляет несколько запросов одновременно

import zerorpc

client = zerorpc.Client()
client.connect("tcp://127.0.0.1:4444")

client.long_running_task(async_=True)
client.other_task(async_=True)

client.close()

Проблема в том, что пока выполняется long_running_task, other_task не запускается.

Желаемый вывод:

1 - started long_running_task
1 - started other_task
2 - finished other_task
2 - finished long_running_task

вместо

1 - started long_running_task
2 - finished long_running_task
1 - started other_task
2 - finished other_task

1 Ответ

1 голос
/ 14 апреля 2019

Здесь есть несколько ошибок

  1. async_ должно быть async.Это обеспечивает немедленный возврат метода клиента
  2. ZeroRPC работает с Gevent.Поэтому вам нужно запустить сервер с gevent.spawn(s.run).Также, чтобы ваш основной гринлет работал.
zerorpc.gevent.spawn(s.run)
while True:
     zerorpc.gevent.sleep(10)
выше 2 недостаточно.В методах API() вы также должны сотрудничать.Вместо time.sleep() используйте gevent.sleep().
...