2 Commits

Author SHA1 Message Date
a56af0f7e9 lab6 2024-01-08 18:27:20 +04:00
feb5c69f17 lab6 2024-01-08 17:37:47 +04:00
74 changed files with 492 additions and 648 deletions

View File

@@ -1,15 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="RabbitMQ" Version="3.6.2" />
<PackageReference Include="RabbitMQ.Client" Version="6.8.1" />
</ItemGroup>
</Project>

View File

@@ -1,31 +0,0 @@
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "accepted");
channel.QueueBind(queue: "accepted",
exchange: "report",
routingKey: string.Empty);
Console.WriteLine(" [*] Waiting for messages.");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += async (model, ea) =>
{
byte[] body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
string outputText = $"Заявление принято к обработке {message}";
Console.WriteLine($" [x] Done. {outputText}");
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: "accepted",
autoAck: false,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();

View File

@@ -1,15 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="RabbitMQ" Version="3.6.2" />
<PackageReference Include="RabbitMQ.Client" Version="6.8.1" />
</ItemGroup>
</Project>

View File

@@ -1,37 +0,0 @@
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
Random rand = new Random();
string queueName = $"denied{rand.Next()}";
channel.QueueDeclare(queue: queueName);
channel.QueueBind(queue: queueName,
exchange: "report",
routingKey: string.Empty);
Console.WriteLine(" [*] Waiting for messages.");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += async (model, ea) =>
{
byte[] body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
int waitTime = rand.Next(20, 90);
Thread.Sleep(waitTime * 100);
string outputText = $"Заявление обработано {message} за {waitTime} минут";
Console.WriteLine($" [x] Done. {outputText}");
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: queueName,
autoAck: false,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();

View File

@@ -1,30 +0,0 @@
using System.Text;
using RabbitMQ.Client;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.ExchangeDeclare(exchange: "report", type: ExchangeType.Fanout);
Random rand = new Random();
foreach (var item in Enumerable.Range(0, 1000))
{
var message = rand.Next().ToString();
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "report",
routingKey: string.Empty,
basicProperties: null,
body: body);
Console.WriteLine($" [x] Поступило заявление {message}");
await Task.Delay(500);
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
static string GetMessage(string[] args)
{
return ((args.Length > 0) ? string.Join(" ", args) : "info: Принято!");
}

View File

@@ -1,15 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="RabbitMQ" Version="3.6.2" />
<PackageReference Include="RabbitMQ.Client" Version="6.8.1" />
</ItemGroup>
</Project>

View File

@@ -1,149 +0,0 @@
# Отчёт по лабораторной работе №4
Выполнил: студент гр. ИСЭбд-41 Михайлов Ю.С.
## Прохождение туториалов
Установил RabbitMQ, Erlang и зашел в брокер под гостем по адресу http://localhost:15672/#/
Туториал 1:
![](pic/1.PNG)
![](pic/2.PNG)
![](pic/3.PNG)
Туториал 2:
![](pic/4.PNG)
![](pic/5.PNG)
![](pic/6.PNG)
![](pic/7.PNG)
Туториал 3:
![](pic/8.PNG)
![](pic/9.PNG)
![](pic/10.PNG)
## Разработка демонстрационных приложений
Предметная область - оформление заявлений на стипендию в университете. Разработано три приложения согласно предметной области.
1. Publisher:
```
using System.Text;
using RabbitMQ.Client;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.ExchangeDeclare(exchange: "report", type: ExchangeType.Fanout);
Random rand = new Random();
foreach (var item in Enumerable.Range(0, 1000))
{
var message = rand.Next().ToString();
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "report",
routingKey: string.Empty,
basicProperties: null,
body: body);
Console.WriteLine($" [x] Поступило заявление {message}");
await Task.Delay(500);
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
static string GetMessage(string[] args)
{
return ((args.Length > 0) ? string.Join(" ", args) : "info: Принято!");
}
```
2. Consumer 1:
```
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "accepted");
channel.QueueBind(queue: "accepted",
exchange: "report",
routingKey: string.Empty);
Console.WriteLine(" [*] Waiting for messages.");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += async (model, ea) =>
{
byte[] body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
string outputText = $"Заявление принято к обработке {message}";
Console.WriteLine($" [x] Done. {outputText}");
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: "accepted",
autoAck: false,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
```
3. Consumer 3:
```
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
Random rand = new Random();
string queueName = $"denied{rand.Next()}";
channel.QueueDeclare(queue: queueName);
channel.QueueBind(queue: queueName,
exchange: "report",
routingKey: string.Empty);
Console.WriteLine(" [*] Waiting for messages.");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += async (model, ea) =>
{
byte[] body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
int waitTime = rand.Next(20, 90);
Thread.Sleep(waitTime * 100);
string outputText = $"Заявление обработано {message} за {waitTime} минут";
Console.WriteLine($" [x] Done. {outputText}");
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: queueName,
autoAck: false,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
```
## Результаты выполнения работы
Запуск каждой программы:
![](pic/11.PNG)
![](pic/12.PNG)
![](pic/13.PNG)
Результаты обработки:
![](pic/14.PNG)
![](pic/15.PNG)
Вывод: Consumer_2 нагружает меньше памяти, чем Consumer_1 и принимает сообщения гораздо быстрее, тем самым не позволяя очереди накапливать огромное количество сообщений

View File

@@ -1,92 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.002.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{964E2358-8624-4435-A0C6-5B4E3C44DB7A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Consumer1", "Main\Consumer1\Consumer1.csproj", "{62525D49-B416-41D2-92DC-3025ABD8FED2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Consumer2", "Main\Consumer2\Consumer2.csproj", "{71B9FCAD-EDBC-42C7-951E-2CEACB18B0AD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Publisher", "Main\Publisher\Publisher.csproj", "{DAE03D67-36C7-424E-87F3-3D900293BA39}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tut1", "tut1", "{E28D0800-55F2-44CC-AF62-9524F6E70A1B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Receive", "tut1\Receive\Receive.csproj", "{A8885758-2115-43E0-8672-5B0E2B33FB57}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Send", "tut1\Send\Send.csproj", "{D2ABDEBD-9E8D-4F38-A5BF-7F469EDB9B8C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tut2", "tut2", "{0E1855BF-5771-45F9-BB46-5D075DE99313}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NewTask", "tut2\NewTask\NewTask.csproj", "{F06A67F1-1606-4D01-84C6-10CE4F4A5273}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Worker", "tut2\Worker\Worker.csproj", "{22F91487-772C-4DA4-9BAC-D6BB44B10D6C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tut3", "tut3", "{D12C599A-23A2-4139-96A3-8188BC6135E2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EmitLogs", "tut3\EmitLogs\EmitLogs.csproj", "{61B1A285-7B3C-4B60-8001-0757E6A88EA9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReceiveLogs", "tut3\ReceiveLogs\ReceiveLogs.csproj", "{63AE28E6-F4E0-40E1-AAAC-F1C11111CFE8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{62525D49-B416-41D2-92DC-3025ABD8FED2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{62525D49-B416-41D2-92DC-3025ABD8FED2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{62525D49-B416-41D2-92DC-3025ABD8FED2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{62525D49-B416-41D2-92DC-3025ABD8FED2}.Release|Any CPU.Build.0 = Release|Any CPU
{71B9FCAD-EDBC-42C7-951E-2CEACB18B0AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{71B9FCAD-EDBC-42C7-951E-2CEACB18B0AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{71B9FCAD-EDBC-42C7-951E-2CEACB18B0AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{71B9FCAD-EDBC-42C7-951E-2CEACB18B0AD}.Release|Any CPU.Build.0 = Release|Any CPU
{DAE03D67-36C7-424E-87F3-3D900293BA39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DAE03D67-36C7-424E-87F3-3D900293BA39}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DAE03D67-36C7-424E-87F3-3D900293BA39}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DAE03D67-36C7-424E-87F3-3D900293BA39}.Release|Any CPU.Build.0 = Release|Any CPU
{A8885758-2115-43E0-8672-5B0E2B33FB57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A8885758-2115-43E0-8672-5B0E2B33FB57}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A8885758-2115-43E0-8672-5B0E2B33FB57}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A8885758-2115-43E0-8672-5B0E2B33FB57}.Release|Any CPU.Build.0 = Release|Any CPU
{D2ABDEBD-9E8D-4F38-A5BF-7F469EDB9B8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D2ABDEBD-9E8D-4F38-A5BF-7F469EDB9B8C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D2ABDEBD-9E8D-4F38-A5BF-7F469EDB9B8C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D2ABDEBD-9E8D-4F38-A5BF-7F469EDB9B8C}.Release|Any CPU.Build.0 = Release|Any CPU
{F06A67F1-1606-4D01-84C6-10CE4F4A5273}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F06A67F1-1606-4D01-84C6-10CE4F4A5273}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F06A67F1-1606-4D01-84C6-10CE4F4A5273}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F06A67F1-1606-4D01-84C6-10CE4F4A5273}.Release|Any CPU.Build.0 = Release|Any CPU
{22F91487-772C-4DA4-9BAC-D6BB44B10D6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{22F91487-772C-4DA4-9BAC-D6BB44B10D6C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{22F91487-772C-4DA4-9BAC-D6BB44B10D6C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{22F91487-772C-4DA4-9BAC-D6BB44B10D6C}.Release|Any CPU.Build.0 = Release|Any CPU
{61B1A285-7B3C-4B60-8001-0757E6A88EA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{61B1A285-7B3C-4B60-8001-0757E6A88EA9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{61B1A285-7B3C-4B60-8001-0757E6A88EA9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{61B1A285-7B3C-4B60-8001-0757E6A88EA9}.Release|Any CPU.Build.0 = Release|Any CPU
{63AE28E6-F4E0-40E1-AAAC-F1C11111CFE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{63AE28E6-F4E0-40E1-AAAC-F1C11111CFE8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{63AE28E6-F4E0-40E1-AAAC-F1C11111CFE8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{63AE28E6-F4E0-40E1-AAAC-F1C11111CFE8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{62525D49-B416-41D2-92DC-3025ABD8FED2} = {964E2358-8624-4435-A0C6-5B4E3C44DB7A}
{71B9FCAD-EDBC-42C7-951E-2CEACB18B0AD} = {964E2358-8624-4435-A0C6-5B4E3C44DB7A}
{DAE03D67-36C7-424E-87F3-3D900293BA39} = {964E2358-8624-4435-A0C6-5B4E3C44DB7A}
{A8885758-2115-43E0-8672-5B0E2B33FB57} = {E28D0800-55F2-44CC-AF62-9524F6E70A1B}
{D2ABDEBD-9E8D-4F38-A5BF-7F469EDB9B8C} = {E28D0800-55F2-44CC-AF62-9524F6E70A1B}
{F06A67F1-1606-4D01-84C6-10CE4F4A5273} = {0E1855BF-5771-45F9-BB46-5D075DE99313}
{22F91487-772C-4DA4-9BAC-D6BB44B10D6C} = {0E1855BF-5771-45F9-BB46-5D075DE99313}
{61B1A285-7B3C-4B60-8001-0757E6A88EA9} = {D12C599A-23A2-4139-96A3-8188BC6135E2}
{63AE28E6-F4E0-40E1-AAAC-F1C11111CFE8} = {D12C599A-23A2-4139-96A3-8188BC6135E2}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A916E577-C16A-4BBF-A3BE-9491C0F5B147}
EndGlobalSection
EndGlobal

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

View File

@@ -1,29 +0,0 @@
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
Console.WriteLine(" [*] Waiting for messages.");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine($" [x] Received {message}");
};
channel.BasicConsume(queue: "hello",
autoAck: true,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();

View File

@@ -1,14 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="RabbitMQ.Client" Version="6.8.1" />
</ItemGroup>
</Project>

View File

@@ -1,24 +0,0 @@
using System.Text;
using RabbitMQ.Client;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
const string message = "Hello World!";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: string.Empty,
routingKey: "hello",
basicProperties: null,
body: body);
Console.WriteLine($" [x] Sent {message}");
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();

View File

@@ -1,14 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="RabbitMQ.Client" Version="6.8.1" />
</ItemGroup>
</Project>

View File

@@ -1,32 +0,0 @@
using System.Text;
using RabbitMQ.Client;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "task_queue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
var message = GetMessage(args);
var body = Encoding.UTF8.GetBytes(message);
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
channel.BasicPublish(exchange: string.Empty,
routingKey: "task_queue",
basicProperties: properties,
body: body);
Console.WriteLine($" [x] Sent {message}");
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
static string GetMessage(string[] args)
{
return ((args.Length > 0) ? string.Join(" ", args) : "Урок 2");
}

View File

@@ -1,14 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="RabbitMQ.Client" Version="6.8.1" />
</ItemGroup>
</Project>

View File

@@ -1,38 +0,0 @@
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "task_queue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
Console.WriteLine(" [*] Waiting for messages.");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
byte[] body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine($" [x] Received {message}");
int dots = message.Split('.').Length - 1;
Thread.Sleep(dots * 1000);
Console.WriteLine(" [x] Done");
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: "task_queue",
autoAck: false,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();

View File

@@ -1,14 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="RabbitMQ.Client" Version="6.8.1" />
</ItemGroup>
</Project>

View File

@@ -1,24 +0,0 @@
using System.Text;
using RabbitMQ.Client;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.ExchangeDeclare(exchange: "logs", type: ExchangeType.Fanout);
var message = GetMessage(args);
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "logs",
routingKey: string.Empty,
basicProperties: null,
body: body);
Console.WriteLine($" [x] Sent {message}");
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
static string GetMessage(string[] args)
{
return ((args.Length > 0) ? string.Join(" ", args) : "info: третий туториал");
}

View File

@@ -1,14 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<OutputType>Exe</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="RabbitMQ.Client" Version="6.4.0" />
</ItemGroup>
</Project>

View File

@@ -1,31 +0,0 @@
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.ExchangeDeclare(exchange: "logs", type: ExchangeType.Fanout);
// declare a server-named queue
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName,
exchange: "logs",
routingKey: string.Empty);
Console.WriteLine(" [*] Waiting for logs.");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
byte[] body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine($" [x] {message}");
};
channel.BasicConsume(queue: queueName,
autoAck: true,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();

View File

@@ -1,14 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<OutputType>Exe</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="RabbitMQ.Client" Version="6.4.0" />
</ItemGroup>
</Project>

View File

@@ -1,5 +1,3 @@
var/result/
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##

View File

@@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.8.34330.188
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp6", "ConsoleApp6\ConsoleApp6.csproj", "{1AE4DE27-ADC3-42DB-837D-862183B51360}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1AE4DE27-ADC3-42DB-837D-862183B51360}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1AE4DE27-ADC3-42DB-837D-862183B51360}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1AE4DE27-ADC3-42DB-837D-862183B51360}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1AE4DE27-ADC3-42DB-837D-862183B51360}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3B908C05-4E83-4046-8B57-2D4306F9FFC3}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,168 @@
using System;
using System.Diagnostics;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("2 - Бенчмарки");
string userChoice = Console.ReadLine();
if (userChoice == "1")
{
// Task 1: Calculate determinant
}
else if (userChoice == "2")
{
int numberOfThreads = GetNumberOfThreads(); // Get the number of threads from the user
Console.WriteLine("\n Вычисление матрицы с размером 10*10:");
RunDeterminantBenchmark(10, numberOfThreads);
Console.ReadLine();
}
else
{
Console.WriteLine("Invalid choice.");
Console.WriteLine("\nPress Enter to return to the main menu...");
Console.ReadLine();
}
Console.ReadLine();
}
static void RunDeterminantBenchmark(int matrixSize, int numberOfThreads)
{
int[,] randomMatrix = GenerateRandomMatrix(matrixSize);
Console.WriteLine("Матрица:");
PrintMatrix(randomMatrix);
Stopwatch stopwatch = Stopwatch.StartNew();
stopwatch.Restart();
double sequentialDeterminant = CalculateDeterminantSequential(randomMatrix);
stopwatch.Stop();
Console.WriteLine($"Обычный: детерминант = {sequentialDeterminant}, время = {stopwatch.Elapsed.TotalSeconds} с");
stopwatch.Restart();
double parallelDeterminant = CalculateDeterminantParallel(randomMatrix, numberOfThreads);
stopwatch.Stop();
Console.WriteLine($"Параллельный: детерминант = {parallelDeterminant}, время = {stopwatch.Elapsed.TotalSeconds} с");
}
static int[,] GenerateRandomMatrix(int size)
{
Random random = new Random();
int[,] matrix = new int[size, size];
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
matrix[i, j] = random.Next(10);
}
}
return matrix;
}
static double CalculateDeterminantSequential(int[,] matrix)
{
int size = matrix.GetLength(0);
double determinant = 0;
if (size == 1)
{
determinant = matrix[0, 0];
}
else if (size == 2)
{
determinant = matrix[0, 0] * matrix[1, 1] - matrix[0, 1] * matrix[1, 0];
}
else
{
for (int j = 0; j < size; j++)
{
determinant += matrix[0, j] * CalculateMinor(matrix, 0, j) * Math.Pow(-1, j);
}
}
return determinant;
}
static double CalculateDeterminantParallel(int[,] matrix, int threads)
{
int size = matrix.GetLength(0);
double determinant = 0;
if (size == 1)
{
determinant = matrix[0, 0];
}
else if (size == 2)
{
determinant = matrix[0, 0] * matrix[1, 1] - matrix[0, 1] * matrix[1, 0];
}
else
{
Parallel.For(0, size, new ParallelOptions { MaxDegreeOfParallelism = threads }, j =>
{
determinant += matrix[0, j] * CalculateMinor(matrix, 0, j) * Math.Pow(-1, j);
});
}
return determinant;
}
static double CalculateMinor(int[,] matrix, int row, int col)
{
int size = matrix.GetLength(0);
int[,] minor = new int[size - 1, size - 1];
int minorRow = 0;
for (int i = 0; i < size; i++)
{
if (i == row)
{
continue;
}
int minorCol = 0;
for (int j = 0; j < size; j++)
{
if (j == col)
{
continue;
}
minor[minorRow, minorCol] = matrix[i, j];
minorCol++;
}
minorRow++;
}
return CalculateDeterminantSequential(minor);
}
static int GetNumberOfThreads()
{
int threads = 1;
Console.WriteLine("Кол-во потоков:");
int.TryParse(Console.ReadLine(), out threads);
return threads;
}
static void PrintMatrix(int[,] matrix)
{
int size = matrix.GetLength(0);
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
Console.Write(matrix[i, j] + " ");
}
Console.WriteLine();
}
}
}

View File

@@ -0,0 +1,23 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"ConsoleApp6/1.0.0": {
"runtime": {
"ConsoleApp6.dll": {}
}
}
}
},
"libraries": {
"ConsoleApp6/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}

View File

@@ -0,0 +1,12 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
"configProperties": {
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

View File

@@ -0,0 +1,63 @@
{
"format": 1,
"restore": {
"C:\\Users\\Tatyana\\source\\repos\\ConsoleApp6\\ConsoleApp6\\ConsoleApp6.csproj": {}
},
"projects": {
"C:\\Users\\Tatyana\\source\\repos\\ConsoleApp6\\ConsoleApp6\\ConsoleApp6.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\Tatyana\\source\\repos\\ConsoleApp6\\ConsoleApp6\\ConsoleApp6.csproj",
"projectName": "ConsoleApp6",
"projectPath": "C:\\Users\\Tatyana\\source\\repos\\ConsoleApp6\\ConsoleApp6\\ConsoleApp6.csproj",
"packagesPath": "C:\\Users\\Tatyana\\.nuget\\packages\\",
"outputPath": "C:\\Users\\Tatyana\\source\\repos\\ConsoleApp6\\ConsoleApp6\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\Tatyana\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Tatyana\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.8.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\Tatyana\.nuget\packages\" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

View File

@@ -0,0 +1,23 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("ConsoleApp6")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("ConsoleApp6")]
[assembly: System.Reflection.AssemblyTitleAttribute("ConsoleApp6")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Создано классом WriteCodeFragment MSBuild.

View File

@@ -0,0 +1 @@
f23481016d3380d0d4750dc1e45f677b98f6d4677ac41689712fd0c1fd55cde2

View File

@@ -0,0 +1,13 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = ConsoleApp6
build_property.ProjectDir = C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =

View File

@@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -0,0 +1 @@
4c5de4fd67998654cd626614b028fea91266d4895705b1ee4eabccf619f0753e

View File

@@ -0,0 +1,14 @@
C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\bin\Debug\net8.0\ConsoleApp6.exe
C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\bin\Debug\net8.0\ConsoleApp6.deps.json
C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\bin\Debug\net8.0\ConsoleApp6.runtimeconfig.json
C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\bin\Debug\net8.0\ConsoleApp6.dll
C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\bin\Debug\net8.0\ConsoleApp6.pdb
C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\obj\Debug\net8.0\ConsoleApp6.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\obj\Debug\net8.0\ConsoleApp6.AssemblyInfoInputs.cache
C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\obj\Debug\net8.0\ConsoleApp6.AssemblyInfo.cs
C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\obj\Debug\net8.0\ConsoleApp6.csproj.CoreCompileInputs.cache
C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\obj\Debug\net8.0\ConsoleApp6.dll
C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\obj\Debug\net8.0\refint\ConsoleApp6.dll
C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\obj\Debug\net8.0\ConsoleApp6.pdb
C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\obj\Debug\net8.0\ConsoleApp6.genruntimeconfig.cache
C:\Users\Tatyana\source\repos\ConsoleApp6\ConsoleApp6\obj\Debug\net8.0\ref\ConsoleApp6.dll

View File

@@ -0,0 +1 @@
2de51abf9d07bee742c3db58e1df461b7e84e5c9ed223dc5d9ffd3c33409f56b

View File

@@ -0,0 +1,68 @@
{
"version": 3,
"targets": {
"net8.0": {}
},
"libraries": {},
"projectFileDependencyGroups": {
"net8.0": []
},
"packageFolders": {
"C:\\Users\\Tatyana\\.nuget\\packages\\": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\Tatyana\\source\\repos\\ConsoleApp6\\ConsoleApp6\\ConsoleApp6.csproj",
"projectName": "ConsoleApp6",
"projectPath": "C:\\Users\\Tatyana\\source\\repos\\ConsoleApp6\\ConsoleApp6\\ConsoleApp6.csproj",
"packagesPath": "C:\\Users\\Tatyana\\.nuget\\packages\\",
"outputPath": "C:\\Users\\Tatyana\\source\\repos\\ConsoleApp6\\ConsoleApp6\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\Tatyana\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100/PortableRuntimeIdentifierGraph.json"
}
}
}
}

View File

@@ -0,0 +1,8 @@
{
"version": 2,
"dgSpecHash": "MFa/OovR2j96Iv1x1Dc0aNjMP4lKdd0L3ONfsvikTrtTeIibj6jpCD+fWr7PUFgtJ2TcL8gcr6q4l/SaNsH4Nw==",
"success": true,
"projectFilePath": "C:\\Users\\Tatyana\\source\\repos\\ConsoleApp6\\ConsoleApp6\\ConsoleApp6.csproj",
"expectedPackageFiles": [],
"logs": []
}

View File

@@ -0,0 +1,33 @@
# Отчёт по лабораторной работе №6
Выполнил: студент гр. ИСЭбд-41 Михайлов Юрий.
## Создание приложения
Выбран язык C#.
Запустим алгоритм с матрицей 10x10 c различными алгоритмами.
![](picture/1.png)
## Бенчмарки
Протекстируем обычный и паралелльный с различными размерами матриц.
Матрица 3х3
![](picture/2.png)
Матрица 5х5
![](picture/3.png)
Матрица 10х10
![](picture/1.png)
Вывод: Скоростные возможности параллельного алгоритма проявляются только при значительном количестве операций. В случае, если операций меньше, стандартный алгоритм может оказаться более быстрым.

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB