diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 608d685..0000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-/DAS_2024_1.iml
-/modules.xml
-/vcs.xml
diff --git a/.idea/.name b/.idea/.name
deleted file mode 100644
index 11a5d8e..0000000
--- a/.idea/.name
+++ /dev/null
@@ -1 +0,0 @@
-main.py
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
deleted file mode 100644
index 74ac817..0000000
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
deleted file mode 100644
index 105ce2d..0000000
--- a/.idea/inspectionProfiles/profiles_settings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index ae8ddd2..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/melnikov_igor_lab_4/Consumer_1.py b/melnikov_igor_lab_4/Consumer_1.py
new file mode 100644
index 0000000..0f3c984
--- /dev/null
+++ b/melnikov_igor_lab_4/Consumer_1.py
@@ -0,0 +1,31 @@
+
+import time
+import pika
+
+
+def callback(ch, method, properties, body):
+ print(f'Consumer 1 получил сообщение: {body.decode()}')
+
+ # Время задержки по условию
+ time.sleep(2)
+
+ print('Consumer 1 закончил обработку')
+
+
+def consume_events_1():
+ connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
+ channel = connection.channel()
+
+ # Создание очереди
+ channel.queue_declare(queue='consumer1_queue')
+ # Привязка очереди
+ channel.queue_bind(exchange='beauty_salon_events', queue='consumer1_queue')
+
+ channel.basic_consume(queue='consumer1_queue', on_message_callback=callback, auto_ack=True)
+
+ print('Consumer 1 начал ожидать сообщения...')
+ channel.start_consuming()
+
+
+if __name__ == "__main__":
+ consume_events_1()
diff --git a/melnikov_igor_lab_4/Consumer_2.py b/melnikov_igor_lab_4/Consumer_2.py
new file mode 100644
index 0000000..df4f950
--- /dev/null
+++ b/melnikov_igor_lab_4/Consumer_2.py
@@ -0,0 +1,28 @@
+import pika
+
+
+def callback(ch, method, properties, body):
+ print(f'Consumer 2 получил сообщение: {body.decode()}')
+
+ # Обработка "нон-стопом"
+ print('Consumer 2 закончил обработку')
+
+
+def consume_events_2():
+ connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
+ channel = connection.channel()
+
+ # Создание очереди
+ channel.queue_declare(queue='consumer2_queue')
+
+ # Привязка очереди
+ channel.queue_bind(exchange='beauty_salon_events', queue='consumer2_queue')
+
+ channel.basic_consume(queue='consumer2_queue', on_message_callback=callback, auto_ack=True)
+
+ print('Consumer 2 начал ожидать сообщения...')
+ channel.start_consuming()
+
+
+if __name__ == "__main__":
+ consume_events_2()
diff --git a/melnikov_igor_lab_4/README.md b/melnikov_igor_lab_4/README.md
new file mode 100644
index 0000000..11b4953
--- /dev/null
+++ b/melnikov_igor_lab_4/README.md
@@ -0,0 +1,51 @@
+### Лабораторная работа №4 - Работа с брокером сообщений
+
+#### Задание
+
+1. Установить брокер сообщений RabbitMQ.
+2. Пройти уроки 1, 2 и 3 из RabbitMQ Tutorials на любом языке программирования.
+3. Продемонстрировать работу брокера сообщений.
+
+#### Описание работы программы:
+
+- **Класс Publisher** осуществляет отправку сообщений своим клиентам.
+
+- **Класс Consumer1** принимает и обрабатывает сообщения с задержкой в 3 секунды.
+
+- **Класс Consumer2** мгновенно принимает и обрабатывает сообщения.
+
+#### Tutorials
+
+1. tutorial_1
+
+![tutorial_1.png](tutorial_1.png)
+
+2. tutorial_2
+
+![tutorial_2.png](tutorial_2.png)
+
+3. tutorial_3
+
+![tutorial_3.png](tutorial_3.png)
+
+## Работа с RabbitMQ
+
+![rabbitMQ.png](rabbitMQ.png)
+
+## Показания очереди queue_1 при одном запущенном экземпляре Consumer_1
+
+![queue_1_1.png](queue_1_1.png)
+
+## Показания очереди queue_2
+
+![queue_2_1.png](queue_2_1.png)
+
+## Показания очереди queue_1 при двух запущенных экземплярах Consumer_1
+![queue_1_2.png](queue_1_2.png)
+
+## Показания очереди queue_1 при трех запущенных экземплярах Consumer_1
+
+![queue_1_3.png](queue_1_3.png)
+
+## Видео работы программы
+https://disk.yandex.ru/i/sfSwbQ3GYpy3FQ
\ No newline at end of file
diff --git a/melnikov_igor_lab_4/publisher.py b/melnikov_igor_lab_4/publisher.py
new file mode 100644
index 0000000..9d53bb2
--- /dev/null
+++ b/melnikov_igor_lab_4/publisher.py
@@ -0,0 +1,28 @@
+import pika
+import time
+
+
+def publish_events():
+ connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
+ channel = connection.channel()
+
+ # Создание exchange типа fanout
+ channel.exchange_declare(exchange='beauty_salon_events', exchange_type='fanout')
+
+ events = [
+ "Test1",
+ "Test2",
+ "Test3",
+ "Test4",
+ "Test5"
+ ]
+
+ while True:
+ event = events[int(time.time()) % len(events)]
+ channel.basic_publish(exchange='beauty_salon_events', routing_key='', body=event)
+ print(f'Отправлено: {event}')
+ time.sleep(1)
+
+
+if __name__ == "__main__":
+ publish_events()
diff --git a/melnikov_igor_lab_4/queue_1_1.png b/melnikov_igor_lab_4/queue_1_1.png
new file mode 100644
index 0000000..0644a69
Binary files /dev/null and b/melnikov_igor_lab_4/queue_1_1.png differ
diff --git a/melnikov_igor_lab_4/queue_1_2.png b/melnikov_igor_lab_4/queue_1_2.png
new file mode 100644
index 0000000..662209a
Binary files /dev/null and b/melnikov_igor_lab_4/queue_1_2.png differ
diff --git a/melnikov_igor_lab_4/queue_1_3.png b/melnikov_igor_lab_4/queue_1_3.png
new file mode 100644
index 0000000..f63fa64
Binary files /dev/null and b/melnikov_igor_lab_4/queue_1_3.png differ
diff --git a/melnikov_igor_lab_4/queue_2_1.png b/melnikov_igor_lab_4/queue_2_1.png
new file mode 100644
index 0000000..d3ab00b
Binary files /dev/null and b/melnikov_igor_lab_4/queue_2_1.png differ
diff --git a/melnikov_igor_lab_4/rabbitMQ.png b/melnikov_igor_lab_4/rabbitMQ.png
new file mode 100644
index 0000000..32a4367
Binary files /dev/null and b/melnikov_igor_lab_4/rabbitMQ.png differ
diff --git a/melnikov_igor_lab_4/tutorial_1.png b/melnikov_igor_lab_4/tutorial_1.png
new file mode 100644
index 0000000..c78ca12
Binary files /dev/null and b/melnikov_igor_lab_4/tutorial_1.png differ
diff --git a/melnikov_igor_lab_4/tutorial_1/receive.py b/melnikov_igor_lab_4/tutorial_1/receive.py
new file mode 100644
index 0000000..f118e0a
--- /dev/null
+++ b/melnikov_igor_lab_4/tutorial_1/receive.py
@@ -0,0 +1,25 @@
+import pika, sys, os
+
+def main():
+ connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
+ channel = connection.channel()
+
+ channel.queue_declare(queue='hello')
+
+ def callback(ch, method, properties, body):
+ print(f" [x] Received {body}")
+
+ channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)
+
+ print(' [*] Waiting for messages. To exit press CTRL+C')
+ channel.start_consuming()
+
+if __name__ == '__main__':
+ try:
+ main()
+ except KeyboardInterrupt:
+ print('Interrupted')
+ try:
+ sys.exit(0)
+ except SystemExit:
+ os._exit(0)
\ No newline at end of file
diff --git a/melnikov_igor_lab_4/tutorial_1/send.py b/melnikov_igor_lab_4/tutorial_1/send.py
new file mode 100644
index 0000000..41cfff2
--- /dev/null
+++ b/melnikov_igor_lab_4/tutorial_1/send.py
@@ -0,0 +1,11 @@
+import pika
+
+connection = pika.BlockingConnection(
+ pika.ConnectionParameters(host='localhost'))
+channel = connection.channel()
+
+channel.queue_declare(queue='hello')
+
+channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
+print(" [x] Sent 'Hello World!'")
+connection.close()
\ No newline at end of file
diff --git a/melnikov_igor_lab_4/tutorial_2.png b/melnikov_igor_lab_4/tutorial_2.png
new file mode 100644
index 0000000..ebddcb0
Binary files /dev/null and b/melnikov_igor_lab_4/tutorial_2.png differ
diff --git a/melnikov_igor_lab_4/tutorial_2/new_task.py b/melnikov_igor_lab_4/tutorial_2/new_task.py
new file mode 100644
index 0000000..a2444e0
--- /dev/null
+++ b/melnikov_igor_lab_4/tutorial_2/new_task.py
@@ -0,0 +1,19 @@
+import pika
+import sys
+
+connection = pika.BlockingConnection(
+ pika.ConnectionParameters(host='localhost'))
+channel = connection.channel()
+
+channel.queue_declare(queue='task_queue', durable=True)
+
+message = ' '.join(sys.argv[1:]) or "Hello World!"
+channel.basic_publish(
+ exchange='',
+ routing_key='task_queue',
+ body=message,
+ properties=pika.BasicProperties(
+ delivery_mode=pika.DeliveryMode.Persistent
+ ))
+print(f" [x] Sent {message}")
+connection.close()
\ No newline at end of file
diff --git a/melnikov_igor_lab_4/tutorial_2/worker.py b/melnikov_igor_lab_4/tutorial_2/worker.py
new file mode 100644
index 0000000..34cb8f7
--- /dev/null
+++ b/melnikov_igor_lab_4/tutorial_2/worker.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+import pika
+import time
+
+connection = pika.BlockingConnection(
+ pika.ConnectionParameters(host='localhost'))
+channel = connection.channel()
+
+channel.queue_declare(queue='task_queue', durable=True)
+print(' [*] Waiting for messages. To exit press CTRL+C')
+
+
+def callback(ch, method, properties, body):
+ print(f" [x] Received {body.decode()}")
+ time.sleep(body.count(b'.'))
+ print(" [x] Done")
+ ch.basic_ack(delivery_tag=method.delivery_tag)
+
+
+channel.basic_qos(prefetch_count=1)
+channel.basic_consume(queue='task_queue', on_message_callback=callback)
+
+channel.start_consuming()
\ No newline at end of file
diff --git a/melnikov_igor_lab_4/tutorial_3.png b/melnikov_igor_lab_4/tutorial_3.png
new file mode 100644
index 0000000..3386b1f
Binary files /dev/null and b/melnikov_igor_lab_4/tutorial_3.png differ
diff --git a/melnikov_igor_lab_4/tutorial_3/emit_log.py b/melnikov_igor_lab_4/tutorial_3/emit_log.py
new file mode 100644
index 0000000..45b6989
--- /dev/null
+++ b/melnikov_igor_lab_4/tutorial_3/emit_log.py
@@ -0,0 +1,13 @@
+import pika
+import sys
+
+connection = pika.BlockingConnection(
+ pika.ConnectionParameters(host='localhost'))
+channel = connection.channel()
+
+channel.exchange_declare(exchange='logs', exchange_type='fanout')
+
+message = ' '.join(sys.argv[1:]) or "info: Hello World!"
+channel.basic_publish(exchange='logs', routing_key='', body=message)
+print(f" [x] Sent {message}")
+connection.close()
\ No newline at end of file
diff --git a/melnikov_igor_lab_4/tutorial_3/queue_1_1.png b/melnikov_igor_lab_4/tutorial_3/queue_1_1.png
new file mode 100644
index 0000000..f890c40
Binary files /dev/null and b/melnikov_igor_lab_4/tutorial_3/queue_1_1.png differ
diff --git a/melnikov_igor_lab_4/tutorial_3/receive_logs.py b/melnikov_igor_lab_4/tutorial_3/receive_logs.py
new file mode 100644
index 0000000..60d881d
--- /dev/null
+++ b/melnikov_igor_lab_4/tutorial_3/receive_logs.py
@@ -0,0 +1,22 @@
+import pika
+
+connection = pika.BlockingConnection(
+ pika.ConnectionParameters(host='localhost'))
+channel = connection.channel()
+
+channel.exchange_declare(exchange='logs', exchange_type='fanout')
+
+result = channel.queue_declare(queue='', exclusive=True)
+queue_name = result.method.queue
+
+channel.queue_bind(exchange='logs', queue=queue_name)
+
+print(' [*] Waiting for logs. To exit press CTRL+C')
+
+def callback(ch, method, properties, body):
+ print(f" [x] {body}")
+
+channel.basic_consume(
+ queue=queue_name, on_message_callback=callback, auto_ack=True)
+
+channel.start_consuming()
\ No newline at end of file