Низкая производительность отправки сообщений с низкой задержкой между актерами, использующими Thespian - PullRequest
0 голосов
/ 24 мая 2018

Я использовал Thespian для разработки приложения, которое потребляет данные с низкой задержкой через сокеты.Первоначально я создал два актера: один потребитель (соединение с сокетом-клиентом) и обработчик.В ходе тестирования я обнаружил некоторые задержки между временем, которое было использовано для отправки одного сообщения получателю (Actor1), и моментом, когда это сообщение поступило в обработчик (Actor2).

Чтобы проверить это, я использовал следующий код.

from thespian.actors import ActorSystem, Actor

import time


class Actor1(Actor):
    def receiveMessage(self, handler, sender):
        # benchmark
        data = {'tic': time.perf_counter(), 'lim': 10000}
        print('Elapsed Time to process {} messages'.format(data['lim']))
        for i in range(data['lim']):
            self.send(handler, data)
        # perf
        toc = time.perf_counter() - data['tic']
        print('Actor 1: {} sec'.format(round(toc, 3)))
        # self.actorSystemShutdown()


class Actor2(Actor):
    def __init__(self):
        self.msg_count = 0

    def receiveMessage(self, data, sender):
        self.msg_count += 1
        if self.msg_count == data['lim']:
            toc = time.perf_counter() - data['tic']
            print('Actor 2: {} sec'.format(round(toc, 3)))

def main():
    asys = ActorSystem('multiprocTCPBase')
    consumer = asys.createActor(Actor1)
    handler = asys.createActor(Actor2)
    asys.tell(consumer, handler)

if __name__ == '__main__':
    main()

Результаты:

Elapsed Time to process 10 messages
Actor 1: 0.002 sec
Actor 2: 0.008 sec

Elapsed Time to process 100 messages
Actor 1: 0.019 sec
Actor 2: 0.099 sec

Elapsed Time to process 1000 messages
Actor 1: 0.131 sec
Actor 2: 0.769 sec

Elapsed Time to process 10000 messages
Actor 1: 1.219 sec
Actor 2: 7.608 sec

Elapsed Time to process 100000 messages
Actor 1: 22.012 sec
Actor 2: 91.419 sec

Смотря эти результаты, что-то не так или отсутствует, что у меня есть в моем коде?, Или есть другой более быстрый способотправлять сообщения между актерами?Кроме того, существует любой другой тест, который поможет нам проанализировать производительность , прокомментированную в документации .

1 Ответ

0 голосов
/ 29 июня 2018

Вы отправляете объект "обработчик" как сообщение.Не уверен, насколько большой объект Actor в Thespian;пустой класс в Python может варьироваться от нескольких сотен байтов до килобайта.Я могу предположить, что это заканчивает тем, что заполняло большое количество буферного пространства довольно быстро.:)

...