mail-pigeon


Namemail-pigeon JSON
Version 1.1.4 PyPI version JSON
download
home_pageNone
SummaryАсинхронная клиент-серверная библиотека с файловой очередью на стороне клиента.
upload_time2025-09-02 12:44:47
maintainerNone
docs_urlNone
authorАнтон Глызин
requires_python>=3.9
licenseMIT
keywords zmq files queue client server python
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            
# Асинхронная клиент-серверная библиотека с файловой очередью на стороне клиента

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

1. [Установка](#установка)
2. [Создание клиента с файловой очередью](#создание-клиента-с-файловой-очередью)
3. [Ожидаем получения сообщений](#ожидаем-получения-сообщений)
4. [Отправить и забыть](#отправить-и-забыть)
5. [Отправить и ждать ответа](#отправить-и-ждать-ответа)
6. [Запасной сервер переадресаций](#запасной-сервер-переадресаций)
7. [Клиент без файловой очереди](#клиент-без-файловой-очереди)
8. [Клиент-серверная синхронизация](#клиент-серверная-синхронизация)
9. [Пользовательская файловая очередь](#пользовательская-файловая-очередь)

---
## Установка

```
pip install mail-pigeon
```

---
## Создание клиента с файловой очередью

```python
from pathlib import Path
from mail_pigeon import MailClient
from mail_pigeon.queue import FilesBox

name = 'app1'

path = Path(__file__).parent / name # где будут скапливаться файлы на отправку
fb = FilesBox(str(path)) # очередь писем на отправку
client = MailClient(
        name_client=name, 
        is_master=True, 
        wait_server=True, 
        out_queue=fb
    )
```

Параметры `MailClient`:
- `name_client` : Название клиента латиницей без пробелов. Оно пригодится для отправки сообщений другим участникам.
- `host_server` : Адрес клиента мастера. По умолчанию - `27.0.0.1`.
- `port_server` : Порт подключения. По умолчанию - `5555`.
- `is_master` : Будет ли этот клиент сервером. Если у вас несколько приложений, то только один может быть сервером переадресаций. Либо можно указать значение `None`, что скажет клиенту, запустить свой сервер, если нет другого. Если установить `True`, но сервер уже запущен в другом приложение, то будет ошибка. В этом случе в других приложениях нужно указать `False`.
- `out_queue` : Очередь писем на отправку. Можно определить свой класс очереди. К примеру очеред через редис.
- `wait_server` : Стоит ли ждать включения сервера. Если вы решите сделать это, то клиент будет ожидать своего внутреннего сервера или тот, что запуститься в другом клиенте.


Параметры `FilesBox`:

- `folder` : Путь до директории с очерелью сообщений.
- `timeout_processing` : Количество секунд в течение которых нужно обработать сообщение, которое было полученно методом `.get()` очереди, но не удаленно методом `.done(key)` из очереди. При запоздание в обработке, сообщение снова окажется в очереди, где его смогут получить другие потоки с помощью `.get()`. Если значение `None`, то из активного списка внутри `FilesBox` не будут происходить перемещения обратно. Но в экземпляре `MailClient` вне зависимости от этого атрибута, перемещения происходят на основание подключился сторонний клиент или отключился.

---
## Ожидаем получения сообщений

```python
...

while True:
    msg = client.get()
    print('')
    print(f'key: {msg.key}') # ИД сообщения в очереди у отправителя
    print(f'sender: {msg.sender}') # из другого приложения
    print(f'recipient: {msg.recipient}') # здесь название нашего приложения
    print(f'content: {msg.content}') # контент
    print('===========')
```

Метод `.get()` можно использовать как с блокировкой, так и с временной блокировкой. Когда метод используется с временной блокировкой `timeout = 3` в секундах, то если результата не будет, то вернется пустота `None`.
Сообщения, которые приходят будут иметь структуру. Данные запроса будут находится в `msg.content`.

---
## Отправить и забыть

Данный метод отправляет текст в другое приложение с названием клиента `app2`. Метод `.send()` способен отправить сообщение и про него забыть. Другая сторона должна ожидать сообщение через метод `.get()`.

```python
client.send(recipient='app2', content='hello world')
```

Параметры метода `.send()`:
- `recipient` : Получатель.
- `content` : Содержимое.
- `wait` : Ожидать ли получения ответа от запроса.
- `timeout` : Сколько времени ожидать сообщения. Если установить, то ответ может быть пустота `None`.
- `key_response` : Ключи из запроса. Обработаный ответ на запрос. Обратные сообщения не блокируются по wait.

---
## Отправить и ждать ответа

Если есть потребность в ожидания ответа от другого приложения, то последовательность действий будет такая:
- Приложение `app1` посылает запрос и ждет ответа.
```python
# app1
content = 'hello'
msg = client.send(recipient='app2', content=content, wait=True) 
content = f'{content} {msg.content}'
print(f'key: {msg.key}') # ИД сообщения в очереди у отправителя
print(f'sender: {msg.sender}') # из другого приложения
print(f'recipient: {msg.recipient}') # здесь название нашего приложения
print(f'content: {content}') # контент 'hello world'
print('===========')
```

- Приложение `app2` получает запрос, обрабатывает его и посылает ответ с таким же ключом как в запросе.
```python
# app2
while True:
    msg = client.get()
    print('')
    print(f'key: {msg.key}') # ИД сообщения в очереди у отправителя
    print(f'sender: {msg.sender}') # из другого приложения
    print(f'recipient: {msg.recipient}') # здесь название нашего приложения
    print(f'content: {msg.content}') # контент 'hello'
    print('===========')
    # обработка запроса
    client.send(recipient=msg.sender, content='world', key_response=msg.key) 
```

---
## Запасной сервер переадресаций

Предположим у вас есть клиент-сервер, который занимается переадресацией. Но если это приложение упадет или остановиться, то связь между клиентами будет нарушена. В этом случае можно сделать так, чтобы было возможно запустить дополнительный сервер в клиенте.

Приложение 1.

```python
from pathlib import Path
from mail_pigeon import MailClient
from mail_pigeon.queue import FilesBox

name = 'app1'

path = Path(__file__).parent / name # очередь писем на отправку
client = MailClient(
        name_client=name, 
        is_master=None, 
        wait_server=True, 
        out_queue=FilesBox(str(path))
    )
```

Приложение 2.
```python
from pathlib import Path
from mail_pigeon import MailClient
from mail_pigeon.queue import FilesBox

name = 'app2'

path = Path(__file__).parent / name # очередь писем на отправку
client = MailClient(
        name_client=name, 
        is_master=None, 
        wait_server=True, 
        out_queue=FilesBox(str(path))
    )
```

Когда установлен атрибут `is_master=None`, то это говорит клиенту, что запустить сервер, если нет другого. Если приложение `app2` упадет, то будет запушен сервер внутри `app1`. Эти сервера должны находится на одном хосте.

---
## Клиент без файловой очереди

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

```python
from mail_pigeon import MailClient
from mail_pigeon.queue import FilesBox

name = 'app1'

client = MailClient(
        name_client=name, 
        is_master=None, 
        wait_server=True
    )
```
В этом случае будет применена очеред внутри самого клиента. Она находится в памяти процесса.

---
## Клиент-серверная синхронизация

У каждого клиента имеется список имен других клиентов. Только если клиент знает об участнике, он может отправлять ему сообщения. Об этом заботиться сервер, который обовещает всех клиентов, кто присоединяется, а кто уходит. Сервер в свою очеред поддерживает связь со всеми клиентами, и если один клиент перестает отвечать, то сервер его отключает и всех уведомляет об его уходе. Также и клиент всегда смотрит, приходят ли сигнали с сервера, и при случае выбирает заданный алгоитм решения, если отсутствуют сигналы.

---
## Пользовательская файловая очередь

Для создания своей очереди есть специальный базовый класс. Понадобиться определить следующие методы.

```python
from typing import List
from mail_pigeon.queue import BaseQueue


class SimpleBox(BaseQueue):
    
    def __init__(self, timeout_processing: int = None):
        super().__init__(timeout_processing)
        self._simple_box = {}

    def _init_live_queue(self) -> List[str]:
        """Инициализация очереди при создание экземпляра.

        Returns:
            List[str]: Список.
        """
        return []
            
    def _remove_data(self, key: str):
        """Удаляет данные одного элемента.

        Args:
            key (str): Ключ.
        """
        if key in self._simple_box:
            del self._simple_box[key]

    def _read_data(self, key: str) -> str:
        """Чтение данных по ключу.

        Args:
            key (str): Название.

        Returns:
            str: Прочитанные данные.
        """
        return self._simple_box[key]

    def _save_data(self, key: str, value: str):
        """Сохраняет данные.

        Args:
            value (str): Ключ.
            value (str): Значение.
        """
        self._simple_box[key] = value
```

В этих методах вам не нужно заботиться о конкурентности данных. Просто опишите откуда читать и куда сохранять.

---
## Внешние ссылки

- [Журнал изменений](https://github.com/AntonGlyzin/mail_pigeon/releases)

- [На проект в Github](https://github.com/AntonGlyzin/mail_pigeon)

- [PYPI](https://pypi.org/project/mail_pigeon/)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "mail-pigeon",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "zmq files queue client server python",
    "author": "\u0410\u043d\u0442\u043e\u043d \u0413\u043b\u044b\u0437\u0438\u043d",
    "author_email": "tosha.glyzin@mail.ru",
    "download_url": null,
    "platform": null,
    "description": "\n# \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\n\n\u041f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0433\u043e\u043b\u0443\u0431\u044c - \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 ZMQ. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u0438\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f. \u041f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0438 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044e \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0439. \u0412 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0414\u0430\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439, \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435 \u0436\u0434\u0435\u0442 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f. \u041a\u043e\u0433\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044e, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u0435\u0449\u0435 \u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u043f\u0438\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043d\u043e\u0432\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f.\n\n1. [\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430](#\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430)\n2. [\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e](#\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435-\u043a\u043b\u0438\u0435\u043d\u0442\u0430-\u0441-\u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439-\u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e)\n3. [\u041e\u0436\u0438\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439](#\u043e\u0436\u0438\u0434\u0430\u0435\u043c-\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439)\n4. [\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438 \u0437\u0430\u0431\u044b\u0442\u044c](#\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c-\u0438-\u0437\u0430\u0431\u044b\u0442\u044c)\n5. [\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438 \u0436\u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0430](#\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c-\u0438-\u0436\u0434\u0430\u0442\u044c-\u043e\u0442\u0432\u0435\u0442\u0430)\n6. [\u0417\u0430\u043f\u0430\u0441\u043d\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0439](#\u0437\u0430\u043f\u0430\u0441\u043d\u043e\u0439-\u0441\u0435\u0440\u0432\u0435\u0440-\u043f\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0439)\n7. [\u041a\u043b\u0438\u0435\u043d\u0442 \u0431\u0435\u0437 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438](#\u043a\u043b\u0438\u0435\u043d\u0442-\u0431\u0435\u0437-\u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439-\u043e\u0447\u0435\u0440\u0435\u0434\u0438)\n8. [\u041a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f](#\u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f-\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f)\n9. [\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c](#\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f-\u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f-\u043e\u0447\u0435\u0440\u0435\u0434\u044c)\n\n---\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n\n```\npip install mail-pigeon\n```\n\n---\n## \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e\n\n```python\nfrom pathlib import Path\nfrom mail_pigeon import MailClient\nfrom mail_pigeon.queue import FilesBox\n\nname = 'app1'\n\npath = Path(__file__).parent / name # \u0433\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b\u044b \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443\nfb = FilesBox(str(path)) # \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0438\u0441\u0435\u043c \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443\nclient = MailClient(\n        name_client=name, \n        is_master=True, \n        wait_server=True, \n        out_queue=fb\n    )\n```\n\n\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b `MailClient`:\n- `name_client` : \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043b\u0430\u0442\u0438\u043d\u0438\u0446\u0435\u0439 \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432. \u041e\u043d\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u0440\u0443\u0433\u0438\u043c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c.\n- `host_server` : \u0410\u0434\u0440\u0435\u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e - `27.0.0.1`.\n- `port_server` : \u041f\u043e\u0440\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e - `5555`.\n- `is_master` : \u0411\u0443\u0434\u0435\u0442 \u043b\u0438 \u044d\u0442\u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0439. \u041b\u0438\u0431\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 `None`, \u0447\u0442\u043e \u0441\u043a\u0430\u0436\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0443, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e. \u0415\u0441\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c `True`, \u043d\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u0436\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0435 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c `False`.\n- `out_queue` : \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0438\u0441\u0435\u043c \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443. \u041c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u043e\u0447\u0435\u0440\u0435\u0434 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0434\u0438\u0441.\n- `wait_server` : \u0421\u0442\u043e\u0438\u0442 \u043b\u0438 \u0436\u0434\u0430\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0415\u0441\u043b\u0438 \u0432\u044b \u0440\u0435\u0448\u0438\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e, \u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 \u0442\u043e\u0442, \u0447\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0435.\n\n\n\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b `FilesBox`:\n\n- `folder` : \u041f\u0443\u0442\u044c \u0434\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u043e\u0447\u0435\u0440\u0435\u043b\u044c\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.\n- `timeout_processing` : \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u043c `.get()` \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043d\u043e \u043d\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u043c `.done(key)` \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u041f\u0440\u0438 \u0437\u0430\u043f\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u043d\u043e\u0432\u0430 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0433\u0434\u0435 \u0435\u0433\u043e \u0441\u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e `.get()`. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 `None`, \u0442\u043e \u0438\u0437 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 `FilesBox` \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u041d\u043e \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435 `MailClient` \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f.\n\n---\n## \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439\n\n```python\n...\n\nwhile True:\n    msg = client.get()\n    print('')\n    print(f'key: {msg.key}') # \u0418\u0414 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f\n    print(f'sender: {msg.sender}') # \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\n    print(f'recipient: {msg.recipient}') # \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\n    print(f'content: {msg.content}') # \u043a\u043e\u043d\u0442\u0435\u043d\u0442\n    print('===========')\n```\n\n\u041c\u0435\u0442\u043e\u0434 `.get()` \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0441 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u043e\u0439, \u0442\u0430\u043a \u0438 \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u043e\u0439. \u041a\u043e\u0433\u0434\u0430 \u043c\u0435\u0442\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u043e\u0439 `timeout = 3` \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445, \u0442\u043e \u0435\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0442\u043e \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u043e\u0442\u0430 `None`.\n\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u0414\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 `msg.content`.\n\n---\n## \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438 \u0437\u0430\u0431\u044b\u0442\u044c\n\n\u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 `app2`. \u041c\u0435\u0442\u043e\u0434 `.send()` \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e \u043d\u0435\u0433\u043e \u0437\u0430\u0431\u044b\u0442\u044c. \u0414\u0440\u0443\u0433\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 `.get()`.\n\n```python\nclient.send(recipient='app2', content='hello world')\n```\n\n\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0435\u0442\u043e\u0434\u0430 `.send()`:\n- `recipient` : \u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c.\n- `content` : \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435.\n- `wait` : \u041e\u0436\u0438\u0434\u0430\u0442\u044c \u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.\n- `timeout` : \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c, \u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0442\u0430 `None`.\n- `key_response` : \u041a\u043b\u044e\u0447\u0438 \u0438\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441. \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e wait.\n\n---\n## \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438 \u0436\u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0430\n\n\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0430\u044f:\n- \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 `app1` \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0436\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0430.\n```python\n# app1\ncontent = 'hello'\nmsg = client.send(recipient='app2', content=content, wait=True) \ncontent = f'{content} {msg.content}'\nprint(f'key: {msg.key}') # \u0418\u0414 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f\nprint(f'sender: {msg.sender}') # \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\nprint(f'recipient: {msg.recipient}') # \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\nprint(f'content: {content}') # \u043a\u043e\u043d\u0442\u0435\u043d\u0442 'hello world'\nprint('===========')\n```\n\n- \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 `app2` \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0438 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043a\u043b\u044e\u0447\u043e\u043c \u043a\u0430\u043a \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435.\n```python\n# app2\nwhile True:\n    msg = client.get()\n    print('')\n    print(f'key: {msg.key}') # \u0418\u0414 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f\n    print(f'sender: {msg.sender}') # \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\n    print(f'recipient: {msg.recipient}') # \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\n    print(f'content: {msg.content}') # \u043a\u043e\u043d\u0442\u0435\u043d\u0442 'hello'\n    print('===========')\n    # \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\n    client.send(recipient=msg.sender, content='world', key_response=msg.key) \n```\n\n---\n## \u0417\u0430\u043f\u0430\u0441\u043d\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0439\n\n\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439. \u041d\u043e \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u043f\u0430\u0434\u0435\u0442 \u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f, \u0442\u043e \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0430. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0435.\n\n\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 1.\n\n```python\nfrom pathlib import Path\nfrom mail_pigeon import MailClient\nfrom mail_pigeon.queue import FilesBox\n\nname = 'app1'\n\npath = Path(__file__).parent / name # \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0438\u0441\u0435\u043c \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443\nclient = MailClient(\n        name_client=name, \n        is_master=None, \n        wait_server=True, \n        out_queue=FilesBox(str(path))\n    )\n```\n\n\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 2.\n```python\nfrom pathlib import Path\nfrom mail_pigeon import MailClient\nfrom mail_pigeon.queue import FilesBox\n\nname = 'app2'\n\npath = Path(__file__).parent / name # \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0438\u0441\u0435\u043c \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443\nclient = MailClient(\n        name_client=name, \n        is_master=None, \n        wait_server=True, \n        out_queue=FilesBox(str(path))\n    )\n```\n\n\u041a\u043e\u0433\u0434\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0430\u0442\u0440\u0438\u0431\u0443\u0442 `is_master=None`, \u0442\u043e \u044d\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0443, \u0447\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 `app2` \u0443\u043f\u0430\u0434\u0435\u0442, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0448\u0435\u043d \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u043d\u0443\u0442\u0440\u0438 `app1`. \u042d\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0445\u043e\u0441\u0442\u0435.\n\n---\n## \u041a\u043b\u0438\u0435\u043d\u0442 \u0431\u0435\u0437 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n\u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u0434\u0430\u0435\u0442 \u0438\u043b\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.\n\n```python\nfrom mail_pigeon import MailClient\nfrom mail_pigeon.queue import FilesBox\n\nname = 'app1'\n\nclient = MailClient(\n        name_client=name, \n        is_master=None, \n        wait_server=True\n    )\n```\n\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u041e\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.\n\n---\n## \u041a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f\n\n\u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043c\u0435\u043d \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0437\u043d\u0430\u0435\u0442 \u043e\u0431 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0435, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u043c\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041e\u0431 \u044d\u0442\u043e\u043c \u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u043e\u0432\u0435\u0449\u0430\u0435\u0442 \u0432\u0441\u0435\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u043a\u0442\u043e \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0441\u044f, \u0430 \u043a\u0442\u043e \u0443\u0445\u043e\u0434\u0438\u0442. \u0421\u0435\u0440\u0432\u0435\u0440 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u044f\u0437\u044c \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438, \u0438 \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c, \u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u0435\u0433\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0438 \u0432\u0441\u0435\u0445 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u043e\u0431 \u0435\u0433\u043e \u0443\u0445\u043e\u0434\u0435. \u0422\u0430\u043a\u0436\u0435 \u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442, \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u043b\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0438 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0438 \u043f\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0438\u0442\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0438\u0433\u043d\u0430\u043b\u044b.\n\n---\n## \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n\n\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441. \u041f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b.\n\n```python\nfrom typing import List\nfrom mail_pigeon.queue import BaseQueue\n\n\nclass SimpleBox(BaseQueue):\n    \n    def __init__(self, timeout_processing: int = None):\n        super().__init__(timeout_processing)\n        self._simple_box = {}\n\n    def _init_live_queue(self) -> List[str]:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430.\n\n        Returns:\n            List[str]: \u0421\u043f\u0438\u0441\u043e\u043a.\n        \"\"\"\n        return []\n            \n    def _remove_data(self, key: str):\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Args:\n            key (str): \u041a\u043b\u044e\u0447.\n        \"\"\"\n        if key in self._simple_box:\n            del self._simple_box[key]\n\n    def _read_data(self, key: str) -> str:\n        \"\"\"\u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043a\u043b\u044e\u0447\u0443.\n\n        Args:\n            key (str): \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435.\n\n        Returns:\n            str: \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.\n        \"\"\"\n        return self._simple_box[key]\n\n    def _save_data(self, key: str, value: str):\n        \"\"\"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435.\n\n        Args:\n            value (str): \u041a\u043b\u044e\u0447.\n            value (str): \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435.\n        \"\"\"\n        self._simple_box[key] = value\n```\n\n\u0412 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043e \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0448\u0438\u0442\u0435 \u043e\u0442\u043a\u0443\u0434\u0430 \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u043a\u0443\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c.\n\n---\n## \u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438\n\n- [\u0416\u0443\u0440\u043d\u0430\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439](https://github.com/AntonGlyzin/mail_pigeon/releases)\n\n- [\u041d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 Github](https://github.com/AntonGlyzin/mail_pigeon)\n\n- [PYPI](https://pypi.org/project/mail_pigeon/)\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430.",
    "version": "1.1.4",
    "project_urls": {
        "Github": "https://github.com/AntonGlyzin/mail_pigeon",
        "Read the docs": "https://mail-pigeon.readthedocs.io/ru/stable",
        "Releases": "https://github.com/AntonGlyzin/mail_pigeon/releases"
    },
    "split_keywords": [
        "zmq",
        "files",
        "queue",
        "client",
        "server",
        "python"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "729f6da20d08ec1e43d54e408518245f200a38e6581b623098dbe7056180b1cf",
                "md5": "9582c29c259c84f936ba7057cd014a07",
                "sha256": "368871526d6030326da9ad104e1d18ad4d8a495e56c3bb9348e5ea746af6d1a1"
            },
            "downloads": -1,
            "filename": "mail_pigeon-1.1.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "9582c29c259c84f936ba7057cd014a07",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 26759,
            "upload_time": "2025-09-02T12:44:47",
            "upload_time_iso_8601": "2025-09-02T12:44:47.035109Z",
            "url": "https://files.pythonhosted.org/packages/72/9f/6da20d08ec1e43d54e408518245f200a38e6581b623098dbe7056180b1cf/mail_pigeon-1.1.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-02 12:44:47",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "AntonGlyzin",
    "github_project": "mail_pigeon",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "mail-pigeon"
}
        
Elapsed time: 2.41431s