Skip to main content

Simple actor system

Project description

PEACEPIE

Простая система акторов. Пакет peacepie представляет собой систему акторов, осуществляющих взаимодействие между собой посредством сообщений. Указанной архитектуре присущи следующие положительные черты:

  • масштабируемость
  • отказоустойчивость
  • реактивность

Основная отличительная черта — изначально поддерживаемая динамическая загрузка акторов из внешних пакетов, что позволяет распространять акторы между процессами и хостами, не перезапуская систему, строить и конфигурировать систему из набора готовых блоков, которые могут храниться как в общедоступных, так и в приватных репозиториях готовых решений. Система представляет собой, в общем случае, множество процессов (из модуля multiprocessing) обмен между которыми происходит через TCP каналы. Внутри процесса акторы обрабатывают сообщения в отдельных корутинах, обмениваясь сообщениями через "asyncio.Queue".

В Python есть проблема конфликта зависимостей, другими словами, мы не можем загрузить две различные версии одного и того же пакета. Библиотека позволяет обойти эти ограничения. Акторы, ссылающиеся на различные версии одного и того же пакета, могут быть размещены в разных процессах и не создавать конфликта, поскольку процессы являются, практически, изолированными друг от друга.

Установка

Установить пакет peacepie можно с помощью менеджера пакетов pip, выполнив следующую команду:

 pip install peacepie

Ознакомление

Создаем проект с любым именем. С помощью команды, приведенной выше, устанавливаем пакет peacepie в проект. Создаем скрипт, приведенный ниже, и запускаем его первый раз без параметров. При запуске скрипта без параметров peacepie формирует окружение по умолчанию. При повторных запусках скрипт лучше запускать с параметром "./config/peacepie.cfg". При первоначальной инициализации происходит скачивание около десятка библиотек из удаленных репозиториев, что занимает некоторое время.

import asyncio
import multiprocessing
import sys

from peacepie import PeaceSystem


multiprocessing.set_start_method('spawn', force=True)


async def main():
    param = sys.argv[1] if len(sys.argv) > 1 else None
    pp = PeaceSystem(param)
    await pp.start()
    try:
        await pp.task
    except asyncio.CancelledError:
        pass


if __name__ == '__main__':
    asyncio.run(main())

В случае удачного запуска приложения по адресу http://localhost:9090 станет доступным простейший веб-интерфейс. В случае если порт занят, в скрипте ./config/app_starter_example.py измените порт на любой доступный и перезапустите скрипт.

В веб-интерфейсе присутствует пять уровней: главный администратор (HEAD), список администраторов хостов (PRIME), список администраторов процессов (PROCESS), список акторов (ACTORS), актор (ACTOR). Главный администратор присутствует на всех уровнях, администраторы хостов и администраторы процессов - на всех нижележащих уровнях. Это связано с тем, что указанные акторы выполняют в системе сразу несколько ролей. Отправлять команды в систему можно только с уровня актора. Все страницы акторов для отправки сообщений равнозначны, единственное различие - поле "Получатель" заполняется именем текущего актора, но его можно изменить.

Из двух кнопок "ASK" и "SEND" лучше выбирать "ASK", поскольку режим "ASK" подразумевает содержательный ответ от исполнителя. Исключение, приходящее на ум,- команда "recreate_actor" в отношении актора типа "SimpleWebFace", который обеспечивает веб-интерфейс.

Ознакомление начнем со стандартного "Hello, World!". Выполняем команду:

Поле Значение
Комманда create_actor
Тело {"class_desc": {"requires_dist": "peacepie_example", "class": "HelloWorld"}, "name": "hello_world"}
Получатель first.main.admin

В результате создастся новый актор типа HelloWorld из пакета peacepie_example, имя можно задать любое, пакет, если пакет еще не кеширован на локальной машине, будет скачан из удаленного репозитория. Если отправить команду "tick" в адрес созданного актора, используя его имя, то актор будет выводить в консоль сообщение "Hello, World!" и возвращать ответ с командой "hello_world"

Поле Значение
Команда tick
Тело
Получатель hello_world

Удалить вновь созданный актор можно командой

Поле Значение
Команда remove_actor
Тело {"name": "hello_world"}
Получатель first.main.admin

Следующий актор похож на предыдущий, но выводит сообщение "Hello, World!" в консоль с заданной периодичностью после получения команды "tick_start". Кроме периодичности можно еще задать лимит сообщений. При заданном лимите актор выведет ограниченное число сообщений.

Поле Значение
Команда create_actor
Тело {"class_desc": {"requires_dist": "peacepie_example", "class": "IteratingHelloWorld"}, "name": "iterating_hello_world"}
Получатель first.main.admin
Поле Значение
Команда set_params
Тело {"params": [{"name": "period", "value": 2}, {"name": "limit", "value": null}]}
Получатель iterating_hello_world
Поле Значение
Команда tick_start
Тело
Получатель iterating_hello_world

Создаем новый процесс:

Поле Значение
Команда create_process
Тело
Получатель first.main.admin

И перемещаем в него наш объект:

Поле Значение
Команда recreate_actor
Тело {"node": "first.process_0.admin", "entity": "iterating_hello_world"}
Получатель first.main.admin

Остановить вывод можно с помощью команды "tick_stop"

Поле Значение
Команда tick_stop
Тело
Получатель iterating_hello_world

Удаляем актор командой

Поле Значение
Команда remove_actor
Тело {"name": "iterating_hello_world"}
Получатель first.process_0.admin

Командой "quit" завершаем выполнение примера. Получатель можем быть любым, поскольку команда "quit" всегда передается главному администратору.

Поле Значение
Комманда quit
Тело
Получатель first.main.admin

Следующий пример более интересный. Создаем актор типа CircleStarter

Поле Значение
Команда create_actor
Тело {"class_desc": {"requires_dist": "peacepie_example", "class": "CircleStarter"}, "name": "circle_starter"}
Получатель first.main.admin

Устанавливаем параметры созданного актора

Поле Значение
Команда set_params
Тело {"params": [{"name": "process_count", "value": 3}, {"name": "dancers_per_process", "value": 2}, {"name": "period", "value": 4}]}
Получатель circle_starter

Далее запускаем процесс

Поле Значение
Команда begin
Тело
Получатель circle_starter

Стартер "circle_starter" создаст 3 процесса и в каждом по 2 актора типа CircleDancer, каждому актору CircleDancer присваивается ссылка на следующий актор, последний актор ссылается на первый. Поведение акторов CircleDancer очень простое - при получении сообщения с командой "tick" актор через период времени заданный в параметре "period" передает сообщение следующему актору. В итоге получается, что сообщение циркулирует по кругу. Сообщение передается как внутри процесса, так и между процессами. Следующая серия команд создает еще один процесс с актором типа CircleDancer внутри и встраивает вновь созданный актор в круг акторов, созданных ранее.

Поле Значение
Команда create_process
Тело
Получатель first.main.admin
Поле Значение
Команда create_actor
Тело {"class_desc": {"requires_dist": "peacepie_example", "class": "CircleDancer"}, "name": "dancer_x"}
Получатель first.process_2.admin
Поле Значение
Команда set_params
Тело {"params": [{"name": "consumer", "value": "dancer_00"}, {"name": "period", "value": 10}]}
Получатель dancer_x
Поле Значение
Команда set_params
Тело {"params": [{"name": "consumer", "value": "dancer_x"}]}
Получатель dancer_05

Командой "quit" завершаем выполнение примера

Поле Значение
Комманда quit
Тело
Получатель first.main.admin

Репозитарий

https://github.com/vnmol/peacepie

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

peacepie-0.2.6.tar.gz (50.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

peacepie-0.2.6-py3-none-any.whl (63.7 kB view details)

Uploaded Python 3

File details

Details for the file peacepie-0.2.6.tar.gz.

File metadata

  • Download URL: peacepie-0.2.6.tar.gz
  • Upload date:
  • Size: 50.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for peacepie-0.2.6.tar.gz
Algorithm Hash digest
SHA256 6963100e4ac7f55f944ebebad6a13430a992961b00fadcc39fc639304ee2000f
MD5 872a098ff1ae5d456689316318ea571a
BLAKE2b-256 fd858488815768d877e8e5422f6d1c2c58eb9d9da1d846c141e59f45be38df54

See more details on using hashes here.

Provenance

The following attestation bundles were made for peacepie-0.2.6.tar.gz:

Publisher: publish.yml on vnmol/peacepie

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file peacepie-0.2.6-py3-none-any.whl.

File metadata

  • Download URL: peacepie-0.2.6-py3-none-any.whl
  • Upload date:
  • Size: 63.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for peacepie-0.2.6-py3-none-any.whl
Algorithm Hash digest
SHA256 e18efcf12b7d60ff759171e559cec33c938e743e03d86bb116095b0113e90e2b
MD5 c860c0279ee22cd5d6495afcba7638a1
BLAKE2b-256 0ef49cab864b6f64979226e22cc0a56096d308cab95bfc7844fe38bf8d6b194f

See more details on using hashes here.

Provenance

The following attestation bundles were made for peacepie-0.2.6-py3-none-any.whl:

Publisher: publish.yml on vnmol/peacepie

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page