Compare commits
9 Commits
Nikiforova
...
Nikiforova
| Author | SHA1 | Date | |
|---|---|---|---|
| 458057c4ea | |||
| cf0e532652 | |||
| da5d19062e | |||
| ca857e1581 | |||
| d86cca7eb4 | |||
| a09a060f48 | |||
| c623026d6c | |||
| 37bd5044b8 | |||
| 5b8b613410 |
@@ -28,4 +28,4 @@ services: # Описание служб (контейнеров).
|
||||
|
||||

|
||||
|
||||
Удаляется всё командой `docker-compose down` или `docker-compose down -v`.
|
||||
Удаляется всё командой `docker-compose down` или `docker-compose down -v`.
|
||||
124
tasks/nikiforova-ts/Lab_1/Readme.md
Normal file
@@ -0,0 +1,124 @@
|
||||
# Отчёт по лабораторной работе №1
|
||||
Выполнил: студентка гр. ИСЭбд-41 Никифорова Татьяна Сергеевна.
|
||||
|
||||
## Разворачивание сервера mediawiki
|
||||
|
||||

|
||||
|
||||
Содержимое файла docker-compose.yml:
|
||||
```yam
|
||||
version: '3'
|
||||
services:
|
||||
mediawiki:
|
||||
image: mediawiki # Используемый образ Mediawiki
|
||||
restart: always # Всегда перезапускать контейнер при остановке
|
||||
ports:
|
||||
- 8080:80 # Проброс портов: внешний порт 8080 к внутреннему порту 80 контейнера
|
||||
links:
|
||||
- database # Связь с сервисом "database"
|
||||
volumes:
|
||||
- images:/var/www/html/images # Монтирование тома для хранения изображений
|
||||
- ./LocalSettings.php:/var/www/html/LocalSettings.php # Монтирование файла конфигурации LocalSettings.php
|
||||
database:
|
||||
image: mariadb # Используемый образ MariaDB
|
||||
restart: always # Всегда перезапускать контейнер при остановке
|
||||
environment:
|
||||
MYSQL_DATABASE: my_wiki # Имя базы данных MariaDB
|
||||
MYSQL_USER: wikiuser # Имя пользователя базы данных MariaDB
|
||||
MYSQL_PASSWORD: example # Пароль пользователя базы данных MariaDB
|
||||
MYSQL_RANDOM_ROOT_PASSWORD: 'yes' # Генерировать случайный пароль для root пользователя MariaDB
|
||||
volumes:
|
||||
- db:/var/lib/mysql # Монтирование тома для хранения данных базы данных MariaDB
|
||||
volumes:
|
||||
images: # Определение тома "images" для хранения изображений Mediawiki
|
||||
db: # Определение тома "db" для хранения данных базы данных MariaDB
|
||||
```
|
||||
Разворачивается командой docker-compose up.
|
||||
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
## Разворачивание сервера wordpress
|
||||
```yam
|
||||
version: '3'
|
||||
services:
|
||||
wordpress:
|
||||
image: wordpress # Используемый образ Docker для WordPress
|
||||
container_name: wordpress # Имя контейнера WordPress
|
||||
ports:
|
||||
- '8081:80' # Проброс портов: внешний порт 8081 к внутреннему порту 80 контейнера
|
||||
environment:
|
||||
WORDPRESS_DB_HOST: mysql # Имя хоста базы данных MySQL
|
||||
WORDPRESS_DB_USER: wp_user # Имя пользователя базы данных WordPress
|
||||
WORDPRESS_DB_PASSWORD: wp_password # Пароль пользователя базы данных WordPress
|
||||
WORDPRESS_DB_NAME: wp_database # Имя базы данных WordPress
|
||||
volumes:
|
||||
- wordpress_data:/var/www/html # Монтирование тома для хранения данных WordPress
|
||||
networks:
|
||||
- wordpress-network # Использование сети "wordpress-network" для связи
|
||||
|
||||
mysql:
|
||||
image: mysql:5.7 # Используемый образ Docker для MySQL
|
||||
container_name: mysql # Имя контейнера MySQL
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: root_password # Пароль для root пользователя MySQL
|
||||
MYSQL_DATABASE: wp_database # Имя базы данных MySQL
|
||||
MYSQL_USER: wp_user # Имя пользователя MySQL для WordPress
|
||||
MYSQL_PASSWORD: wp_password # Пароль пользователя MySQL для WordPress
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql # Монтирование тома для хранения данных MySQL
|
||||
networks:
|
||||
- wordpress-network # Использование сети "wordpress-network" для связи
|
||||
networks:
|
||||
wordpress-network: # Определение сети "wordpress-network" для связи между контейнерами
|
||||
volumes:
|
||||
wordpress_data: # Определение тома данных "wordpress_data" для хранения данных WordPress
|
||||
mysql_data: # Определение тома данных "mysql_data" для хранения данных MySQL
|
||||
```
|
||||

|
||||
|
||||
## Разворачивание сервера redmine
|
||||
Содержимое файла docker-compose.yml:
|
||||
```yam
|
||||
version: '2'
|
||||
services:
|
||||
mariadb: # Определение сервиса MariaDB
|
||||
image: docker.io/bitnami/mariadb:11.0 # Используемый образ MariaDB
|
||||
volumes:
|
||||
- 'mariadb_data:/bitnami/mariadb' # Монтирование тома для данных MariaDB
|
||||
environment:
|
||||
# ALLOW_EMPTY_PASSWORD is recommended only for development.
|
||||
- ALLOW_EMPTY_PASSWORD=yes # Разрешение использовать пустой пароль (рекомендуется только для разработки).
|
||||
- MARIADB_USER=bn_redmine # Имя пользователя базы данных MariaDB
|
||||
- MARIADB_DATABASE=bitnami_redmine # Имя базы данных MariaDB
|
||||
|
||||
redmine: # Определение сервиса Redmine
|
||||
image: docker.io/bitnami/redmine:5 # Используемый образ Redmine
|
||||
ports:
|
||||
- '3000:3000' # Проброс портов: внешний порт 3000 к внутреннему порту 3000
|
||||
volumes:
|
||||
- 'redmine_data:/bitnami/redmine' # Монтирование тома для данных Redmine
|
||||
depends_on:
|
||||
- mariadb # Зависимость от сервиса MariaDB (Redmine будет запущен только после MariaDB)
|
||||
environment:
|
||||
# ALLOW_EMPTY_PASSWORD is recommended only for development.
|
||||
- ALLOW_EMPTY_PASSWORD=yes # Разрешение использовать пустой пароль (рекомендуется только для разработки).
|
||||
- REDMINE_DATABASE_HOST=mariadb # Имя хоста базы данных MariaDB
|
||||
- REDMINE_DATABASE_PORT_NUMBER=3306 # Порт базы данных MariaDB
|
||||
- REDMINE_DATABASE_USER=bn_redmine # Имя пользователя базы данных Redmine
|
||||
- REDMINE_DATABASE_NAME=bitnami_redmine # Имя базы данных Redmine
|
||||
volumes:
|
||||
mariadb_data: # Определение тома mariadb_data
|
||||
driver: local # Использование локального драйвера для хранения данных на хосте
|
||||
redmine_data: # Определение тома redmine_data
|
||||
driver: local # Использование локального драйвера для хранения данных на хосте
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
BIN
tasks/nikiforova-ts/Lab_1/photo/photo1.jpg
Normal file
|
After Width: | Height: | Size: 265 KiB |
BIN
tasks/nikiforova-ts/Lab_1/photo/photo2.jpg
Normal file
|
After Width: | Height: | Size: 483 KiB |
BIN
tasks/nikiforova-ts/Lab_1/photo/photo3.jpg
Normal file
|
After Width: | Height: | Size: 591 KiB |
BIN
tasks/nikiforova-ts/Lab_1/photo/photo4.jpg
Normal file
|
After Width: | Height: | Size: 429 KiB |
BIN
tasks/nikiforova-ts/Lab_1/photo/photo5.png
Normal file
|
After Width: | Height: | Size: 294 KiB |
BIN
tasks/nikiforova-ts/Lab_1/photo/photo6.jpg
Normal file
|
After Width: | Height: | Size: 253 KiB |
BIN
tasks/nikiforova-ts/Lab_1/photo/photo7.png
Normal file
|
After Width: | Height: | Size: 276 KiB |
2
tasks/nikiforova-ts/Lab_2/.dockerignore
Normal file
@@ -0,0 +1,2 @@
|
||||
*/*/bin
|
||||
*/*/obj
|
||||
28
tasks/nikiforova-ts/Lab_2/Lab_2.sln
Normal file
@@ -0,0 +1,28 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.0.31903.59
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-1", "worker-1\worker-1.csproj", "{1B2479E1-B738-43B3-BD2E-0A8E0A72081D}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-2", "worker-2\worker-2.csproj", "{0F8A06E1-9249-412F-886F-8C0D24057473}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{1B2479E1-B738-43B3-BD2E-0A8E0A72081D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1B2479E1-B738-43B3-BD2E-0A8E0A72081D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1B2479E1-B738-43B3-BD2E-0A8E0A72081D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1B2479E1-B738-43B3-BD2E-0A8E0A72081D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{0F8A06E1-9249-412F-886F-8C0D24057473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{0F8A06E1-9249-412F-886F-8C0D24057473}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{0F8A06E1-9249-412F-886F-8C0D24057473}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{0F8A06E1-9249-412F-886F-8C0D24057473}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
52
tasks/nikiforova-ts/Lab_2/Readme.md
Normal file
@@ -0,0 +1,52 @@
|
||||
# Отчёт по лабораторной работе №2
|
||||
Выполнила: студентка гр. ИСЭбд-41 Никифорова Татьяна Сергеевна.
|
||||
|
||||
Вариант программы 1: Ищет в каталоге /var/data файл с самым коротким названием и перекладывает его в /var/result/data.txt.
|
||||
Вариант программы 2: Ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt.
|
||||
|
||||
# Создание приложений
|
||||
|
||||
Создали два приложения с помощью команд:
|
||||
|
||||
```yam
|
||||
dotnet new console -o worker-1
|
||||
dotnet new console -o worker-2
|
||||
```
|
||||
программа 1: Ищет в каталоге /var/data файл с самым коротким названием и перекладывает его в /var/result/data.txt.
|
||||
|
||||
[Текст программы worker-1](worker-1/Program.cs)
|
||||
|
||||
Программа 2: Ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt
|
||||
|
||||
[Текст программы worker-2](worker-2/Program.cs)
|
||||
|
||||
Cоздан файл [.gitignore](.gitignore) с помощью команды dotnet new gitignore.
|
||||
|
||||
# Настройка окуржения
|
||||
|
||||
Для связи двух приложений воспользуемся следующей схемой:
|
||||
|
||||
Для каждой программы были созданы файлы Dockerfile ([программа 1](worker-1/Dockerfile), [программа 2](worker-1/Dockerfile)) с подробным описанием процесса сборки.
|
||||
|
||||
Был создан файл [docker-compose.yml](docker-compose.yml), в котором указан манифест для запуска распределённого приложения.
|
||||
|
||||
Дополнительно был создан файл [.dockerignore](.dockerignore) и дополнен [.gitignore](.gitignore), чтобы исключить для сборки и коммита всё лишнее.
|
||||
|
||||
# Сборка и запуск
|
||||
|
||||
В каталог ./data помещены 2 файла: another_data.txt и data.txt.
|
||||
Для запуска приложения необходимо ввести команду `docker compose up --build`.
|
||||
|
||||
Результат запуска после сборки:
|
||||
```
|
||||
[+] Running 3/3
|
||||
✔ Network lab_2_default Created
|
||||
✔ Container lab_2-worker-1-1 Created
|
||||
✔ Container lab_2-worker-2-1 Created
|
||||
Attaching to lab_2-worker-1-1, lab_2-worker-2-1
|
||||
lab_2-worker-1-1 exited with code 0
|
||||
lab_2-worker-2-1 | Максимальное число во входных данных: 4
|
||||
lab_2-worker-2-1 | Квадрат максимального числа: 16
|
||||
lab_2-worker-2-1 exited with code 0
|
||||
```
|
||||
В результате в каталоге `./result` создался файл `result.txt` с содержимым `16`, что соответствует входным данным.
|
||||
4
tasks/nikiforova-ts/Lab_2/data/another_data.txt.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
10
|
||||
10
|
||||
10
|
||||
10
|
||||
4
tasks/nikiforova-ts/Lab_2/data/data.tx.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
13
tasks/nikiforova-ts/Lab_2/docker-compose.yml
Normal file
@@ -0,0 +1,13 @@
|
||||
version: "3.1"
|
||||
services:
|
||||
worker-1:
|
||||
build: ./worker-1
|
||||
volumes:
|
||||
- ./data:/var/data
|
||||
- ./result:/var/result
|
||||
worker-2:
|
||||
build: ./worker-2
|
||||
volumes:
|
||||
- ./result:/var/result
|
||||
depends_on:
|
||||
- worker-1
|
||||
4
tasks/nikiforova-ts/Lab_2/result/data.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
1
tasks/nikiforova-ts/Lab_2/result/result.txt
Normal file
@@ -0,0 +1 @@
|
||||
16
|
||||
17
tasks/nikiforova-ts/Lab_2/worker-1/Dockerfile
Normal file
@@ -0,0 +1,17 @@
|
||||
#задаем базовый образ на .net 6.0
|
||||
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
|
||||
#задаем рабочую директорию
|
||||
WORKDIR /app
|
||||
|
||||
#в каталог копируем файлы и папки в контейнер
|
||||
COPY . /app
|
||||
#создаем образы и устанавливаем данные пакеты в контейнер
|
||||
RUN dotnet restore
|
||||
COPY . .
|
||||
RUN dotnet publish -c Release -o /publish
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:6.0 as runtime
|
||||
WORKDIR /publish
|
||||
COPY --from=build-env /publish .
|
||||
#вызываем приложение во время выполнения контейнера
|
||||
ENTRYPOINT ["dotnet", "worker-1.dll"]
|
||||
33
tasks/nikiforova-ts/Lab_2/worker-1/Program.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
|
||||
string[] files = Directory.GetFiles("/var/data");
|
||||
string minFilePath = "";
|
||||
long minFileNameLength = long.MaxValue;
|
||||
foreach (var filePath in files)
|
||||
{
|
||||
FileInfo fileInfo = new FileInfo(filePath);
|
||||
string fileName = Path.GetFileName(filePath);
|
||||
|
||||
if (fileName.Length < minFileNameLength)
|
||||
{
|
||||
minFileNameLength = fileName.Length;
|
||||
minFilePath = filePath;
|
||||
}
|
||||
}
|
||||
using (FileStream sourceStream = File.OpenRead(minFilePath))
|
||||
{
|
||||
byte[] buffer = new byte[sourceStream.Length];
|
||||
await sourceStream.ReadAsync(buffer, 0, buffer.Length);
|
||||
string text = Encoding.Default.GetString(buffer);
|
||||
|
||||
using (FileStream targetStream = new FileStream("/var/result/data.txt", FileMode.OpenOrCreate))
|
||||
{
|
||||
targetStream.SetLength(0);
|
||||
byte[] textBytes = Encoding.Default.GetBytes(text);
|
||||
await targetStream.WriteAsync(textBytes, 0, textBytes.Length);
|
||||
}
|
||||
}
|
||||
11
tasks/nikiforova-ts/Lab_2/worker-1/worker-1.csproj
Normal file
@@ -0,0 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<RootNamespace>worker_1</RootNamespace>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
17
tasks/nikiforova-ts/Lab_2/worker-2/Dockerfile
Normal file
@@ -0,0 +1,17 @@
|
||||
#задаем базовый образ на .net 6.0
|
||||
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
|
||||
#задаем рабочую директорию
|
||||
WORKDIR /src
|
||||
|
||||
#в каталог копируем файлы и папки в контейнер
|
||||
COPY . ./
|
||||
#создаем образы и устанавливаем данные пакеты в контейнер
|
||||
RUN dotnet restore
|
||||
COPY . .
|
||||
RUN dotnet publish -c Release -o /publish
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:6.0 as runtime
|
||||
WORKDIR /publish
|
||||
COPY --from=build-env /publish .
|
||||
#вызываем приложение во время выполнения контейнера
|
||||
ENTRYPOINT ["dotnet", "worker-2.dll"]
|
||||
34
tasks/nikiforova-ts/Lab_2/worker-2/Program.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
string[] numbers;
|
||||
using (FileStream fstream = File.OpenRead("/var/result/data.txt"))
|
||||
{
|
||||
byte[] buffer = new byte[fstream.Length];
|
||||
await fstream.ReadAsync(buffer, 0, buffer.Length);
|
||||
string text = Encoding.Default.GetString(buffer);
|
||||
text = text.Replace("\r\n", ";");
|
||||
numbers = text.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
}
|
||||
|
||||
int maxNumber = int.MinValue;
|
||||
foreach (var number in numbers)
|
||||
{
|
||||
int currentNumber = Convert.ToInt32(number);
|
||||
if (currentNumber > maxNumber)
|
||||
{
|
||||
maxNumber = currentNumber;
|
||||
}
|
||||
}
|
||||
|
||||
int maxNumberSquared = maxNumber * maxNumber;
|
||||
|
||||
using (FileStream fstream = new FileStream("/var/result/result.txt", FileMode.OpenOrCreate))
|
||||
{
|
||||
byte[] buffer = Encoding.Default.GetBytes(maxNumberSquared.ToString());
|
||||
await fstream.WriteAsync(buffer, 0, buffer.Length);
|
||||
}
|
||||
|
||||
Console.WriteLine("Максимальное число во входных данных: " + maxNumber);
|
||||
Console.WriteLine("Квадрат максимального числа: " + maxNumberSquared);
|
||||
11
tasks/nikiforova-ts/Lab_2/worker-2/worker-2.csproj
Normal file
@@ -0,0 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<RootNamespace>worker_2</RootNamespace>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,38 +0,0 @@
|
||||
# Отчёт по лабораторной работе №5
|
||||
|
||||
Выполнила: студентка гр. ИСЭбд-41 Никифорова Татьяна Сергеевна.
|
||||
|
||||
## Создание приложения
|
||||
|
||||
Выбрала язык Python.
|
||||
|
||||
Запустим алгоритм с матрицей 10x10 c различными алгоритмами.
|
||||
|
||||

|
||||

|
||||
|
||||
## Бенчмарки
|
||||
|
||||
Протекстируем обычный и паралелльный с различными размерами матриц.
|
||||
|
||||
Матрица 100х100
|
||||
|
||||

|
||||

|
||||
|
||||
Матрица 300х300
|
||||
|
||||

|
||||

|
||||
|
||||
Матрица 500х500
|
||||
|
||||

|
||||

|
||||
|
||||
Вывод: Для небольших матриц и с небольшим количеством ядер процессора параллельная реализация может не всегда оказаться быстрее из-за дополнительных накладных расходов.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 223 KiB |
|
Before Width: | Height: | Size: 224 KiB |
|
Before Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 147 KiB |
@@ -1,100 +0,0 @@
|
||||
import numpy as np
|
||||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
from multiprocessing import Pool
|
||||
import time
|
||||
|
||||
def multiply_matrices_sequential(matrix_a, matrix_b):
|
||||
return np.dot(matrix_a, matrix_b)
|
||||
|
||||
def multiply_matrices_parallel(args):
|
||||
row, matrix_a, matrix_b, cols = args
|
||||
return [sum(matrix_a[row, k] * matrix_b[k, col] for k in range(cols)) for col in range(cols)]
|
||||
|
||||
def multiply_matrices(matrix_size, parallel=False, num_threads=None):
|
||||
matrix_a = np.random.randint(1, 10, size=(matrix_size, matrix_size)) # Генерация целых чисел от 1 до 10
|
||||
matrix_b = np.random.randint(1, 10, size=(matrix_size, matrix_size))
|
||||
|
||||
if parallel:
|
||||
start_time = time.time()
|
||||
args = [(row, matrix_a, matrix_b, matrix_size) for row in range(matrix_size)]
|
||||
|
||||
with Pool(num_threads) as pool:
|
||||
result = np.array(pool.map(multiply_matrices_parallel, args))
|
||||
|
||||
end_time = time.time()
|
||||
else:
|
||||
start_time = time.time()
|
||||
result = multiply_matrices_sequential(matrix_a, matrix_b)
|
||||
end_time = time.time()
|
||||
|
||||
execution_time = end_time - start_time
|
||||
|
||||
return matrix_a, matrix_b, result, execution_time
|
||||
|
||||
def run_multiplication():
|
||||
matrix_size = int(matrix_size_entry.get())
|
||||
algorithm_choice = algorithm_var.get()
|
||||
parallel = True if algorithm_choice == 'Параелльный' else False
|
||||
num_threads = int(threads_entry.get()) if parallel else None
|
||||
|
||||
matrix_a, matrix_b, result, execution_time = multiply_matrices(matrix_size, parallel, num_threads)
|
||||
|
||||
result_text.config(state=tk.NORMAL)
|
||||
result_text.delete("1.0", tk.END)
|
||||
result_text.insert(tk.END, f"Результат:\n{result}\n\nВремя: {execution_time:.6f} секунд")
|
||||
result_text.config(state=tk.DISABLED)
|
||||
|
||||
matrix_a_text.config(state=tk.NORMAL)
|
||||
matrix_a_text.delete("1.0", tk.END)
|
||||
matrix_a_text.insert(tk.END, f"Матрица A:\n{matrix_a}")
|
||||
matrix_a_text.config(state=tk.DISABLED)
|
||||
|
||||
matrix_b_text.config(state=tk.NORMAL)
|
||||
matrix_b_text.delete("1.0", tk.END)
|
||||
matrix_b_text.insert(tk.END, f"Матрица B:\n{matrix_b}")
|
||||
matrix_b_text.config(state=tk.DISABLED)
|
||||
|
||||
# GUI setup
|
||||
root = tk.Tk()
|
||||
root.title("Matrix Multiplication")
|
||||
|
||||
# Matrix Size
|
||||
matrix_size_label = ttk.Label(root, text="Размер матрицы:")
|
||||
matrix_size_label.grid(row=0, column=0, padx=5, pady=5)
|
||||
matrix_size_entry = ttk.Entry(root)
|
||||
matrix_size_entry.grid(row=0, column=1, padx=5, pady=5)
|
||||
matrix_size_entry.insert(0, "")
|
||||
|
||||
# Algorithm Choice
|
||||
algorithm_label = ttk.Label(root, text="Алгоритм:")
|
||||
algorithm_label.grid(row=1, column=0, padx=5, pady=5)
|
||||
algorithm_var = tk.StringVar(value="Обычный")
|
||||
algorithm_combobox = ttk.Combobox(root, textvariable=algorithm_var, values=["Обычный", "Паралелльный"])
|
||||
algorithm_combobox.grid(row=1, column=1, padx=5, pady=5)
|
||||
|
||||
# Threads (only for parallel algorithm)
|
||||
threads_label = ttk.Label(root, text="Потоки:")
|
||||
threads_label.grid(row=2, column=0, padx=5, pady=5)
|
||||
threads_entry = ttk.Entry(root)
|
||||
threads_entry.grid(row=2, column=1, padx=5, pady=5)
|
||||
threads_entry.insert(0, "4")
|
||||
#threads_entry.state(['readonly']) # make it read-only initially
|
||||
|
||||
# Run Button
|
||||
run_button = ttk.Button(root, text="Начать", command=run_multiplication)
|
||||
run_button.grid(row=3, column=0, columnspan=2, pady=10)
|
||||
|
||||
# Result Text
|
||||
result_text = tk.Text(root, height=15, width=50, state=tk.DISABLED)
|
||||
result_text.grid(row=4, column=0, columnspan=2, padx=10, pady=10)
|
||||
|
||||
# Generated Matrix A
|
||||
matrix_a_text = tk.Text(root, height=10, width=25, state=tk.DISABLED)
|
||||
matrix_a_text.grid(row=5, column=0, padx=10, pady=5)
|
||||
|
||||
# Generated Matrix B
|
||||
matrix_b_text = tk.Text(root, height=10, width=25, state=tk.DISABLED)
|
||||
matrix_b_text.grid(row=5, column=1, padx=10, pady=5)
|
||||
|
||||
root.mainloop()
|
||||