Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 12, 2019 16:28:52

regnor
Зарегистрирован: 2017-08-16
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как уменьшить потребление памяти

Здравствуйте. Есть клиент-серверное приложение. Суть клиента отправлять на сервер свой внешний айпи адрес. В данный момент он жрет около 14 мегабайт. Подскажите, можно ли как то уменьшить этот объем?

 import subprocess, sys, socket, time, re, datetime, http.client, random
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox as mg
from uuid import getnode
class Client_authentication:
    def __init__(self):
        self.key_client = 0
    # GUI для аутентификация
    def authentication_gui(self):
        authentication = tk.Toplevel(root)
        authentication.geometry('300x130')
        x = (authentication.winfo_screenwidth() - authentication.winfo_reqwidth()) / 2
        y = (authentication.winfo_screenheight() - authentication.winfo_reqheight()) / 2
        authentication.wm_geometry("+%d+%d" % (x, y))
        label_authentication = tk.Label(authentication, text='Введите ключ для аутентификации:')
        self.area_authentication = tk.Entry(authentication, bd='2', width=30)
        aply_authentication = tk.Button(authentication, text="Применить ключ", command=self.authentication, width=20)
        cansel = tk.Button(authentication, text='Выход', command=root.destroy, width=20)
        label_authentication.place(x=55, y=10)
        self.area_authentication.place(x=60, y=50)
        aply_authentication.place(x=15, y=90)
        cansel.place(x=155, y=90)
        authentication.mainloop()
    # Обработка аутентификации
    def authentication(self):
        self.key_client = self.area_authentication.get()
        if self.key_client == '':
            mg.showerror('Ошибка', 'Ключ пуст.')
            return
        sock.send(bytes(self.key_client, 'UTF-8'))
        data = sock.recv(1024)
        data = data.decode()
        if data == 'False':
            mg.showerror('Ошибка', 'Ключ не верен.')
            root.destroy()
        else:
            sock.send(bytes(address, 'UTF-8'))
            mg.showinfo('Успешно', 'Добро пожаловать в наши ряды!\nПерезапустите клиент.')
            root.destroy()
    # Проверка hosts
    def check_host(self):
        reference = []
        with open('C:/Windows/System32/drivers/etc/hosts', 'r') as file:
            file = file.read()
        for i in reference:
            file.rstrip()
            check = bool(file.find(i) + 1)
            if check == False:
                with open('C:/Windows/System32/drivers/etc/hosts', 'a') as f:
                    f.write(i)
if __name__ == '__main__':
    root = tk.Tk()
    root.geometry('320x250')
    root.title('Client ver. 0.1a')
    # Окно по центру, в гугле нашел))
    x = (root.winfo_screenwidth() - root.winfo_reqwidth()) / 2.5
    y = (root.winfo_screenheight() - root.winfo_reqheight()) / 2.5
    root.wm_geometry("+%d+%d" % (x, y))
    label_info = tk.Label(root, font=6, justify='left')
    label_info.grid()
    label_info['text'] += 'Client ver. 0.1a приветствует Вас.\n'
    root.update()
    time.sleep(1)
    client_authentication = Client_authentication()
    try:
        client_authentication.check_host()
        label_info['text'] += 'Проверили файл hosts...\n'
    except(PermissionError):
        label_info['text'] += 'Не удалось получить доступ к файлу hosts...\n'
        label_info['text'] += 'Надеемся там все верно...\n'
    conn = http.client.HTTPConnection("ifconfig.me")
    conn.request("GET", "/ip")
    now = datetime.datetime.now().strftime('%H:%M %d-%m-%Y')
    len_pack = []
    google_dns = '8.8.8.8'
    host = '192.168.33.246'
    port = 49444
    address = str(getnode())
    ip_address = conn.getresponse().read().decode()
    ip_address_temp = ip_address
    name_client = 'Не_установлено'
    label_info['text'] += 'Проверяем интернет...\n'
    root.update()
    time.sleep(1)
    # Вызов пинга для проверки инета
    inet = subprocess.call(["ping", "-n", "1", google_dns], stdout=False)
    if inet == 0:
        label_info['text'] += 'Успешно!\n'
        root.update()
        time.sleep(1)
    else:
        mg.showerror('Ошибка', 'Хост 8.8.8.8 не доступен. Нет интернета.')
        sys.exit()
    label_info['text'] += 'Подключаемся к серверу...\n'
    root.update()
    time.sleep(1)
    # Подключаемся в хосту и читаем что он нам передал
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        sock.connect((host, port))
    except(ConnectionRefusedError):
        mg.showerror('Ошибка', 'Хост ' + host + ' не доступен.')
        sys.exit()
    except(TimeoutError):
        mg.showerror('Ошибка', 'Ответ от сервера не получен. Программа завершилась по таймауту.')
        sys.exit()
    try:
        sock.send(bytes(address, 'UTF-8'))
    except(ConnectionRefusedError):
        mg.showerror('Ошибка', 'Хост ' + host + ' не доступен.')
        sys.exit()
    try:
        data = sock.recv(1024)
    except(OSError):
        mg.showerror('Ошибка', 'Не удалось получить данные с удаленного хоста.')
        sys.exit()
    data = data.decode()
    if 'False' in data:
        client_authentication.authentication_gui()
    label_info['text'] += 'Успешно!\n'
    root.update()
    time.sleep(1)
    label_info['text'] += 'Получаем данные от сервера...\n'
    root.update()
    time.sleep(1)
    # Записываем в список все данные от хоста
    len_pack = re.findall('\d+', data)
    if not len_pack:
        mg.showerror('Ошибка', 'Не удалось получить данные с удаленного хоста')
        sys.exit()
    if inet == 0:
        sock.send(bytes('Подтверждение от машины с ID ' + address + ' время ' + now + ' ' + ip_address, 'UTF-8'))
        label_info['text'] += 'Успешно!\n'
        root.update()
        time.sleep(0.5)
        label_info['text'] += 'Можно заходить в 1С.\n'
        root.update()
        label_info['text'] += 'Спасибо!\n'
        root.update()
        button_ok = tk.Button(root, text='Закрыть', command=root.destroy, width=10)
        button_ok.place(x=210, y=210)
        root.update()
    else:
        mg.showerror('Ошибка', 'Хост 8.8.8.8 не доступен. Нет интернета.')
        sys.exit()
    sock.close()
    root.mainloop()
    # Бесконечный фоновый цикл
    while True:
        # conn = http.client.HTTPConnection("ifconfig.me")
        # conn.request("GET", "/ip")
        # ip_address = conn.getresponse().read().decode()
        now = datetime.datetime.now().strftime('%H:%M %d-%m-%Y')
        a = random.randint(0, 255)
        b = random.randint(0, 255)
        c = random.randint(0, 255)
        d = random.randint(0, 255)
        ip_address = str(a) + '.' + str(b) + '.' + str(c) + '.' + str(d)
        if ip_address_temp != ip_address:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            try:
                sock.connect((host, port))
            except(ConnectionRefusedError):
                mg.showerror('Ошибка', 'Хост ' + host + ' не доступен.')
                sys.exit()
            except(TimeoutError):
                mg.showerror('Ошибка', 'Ответ от сервера не получен. Программа завершилась по таймауту.')
                sys.exit()
            try:
                sock.send(bytes(address, 'UTF-8'))
            except(ConnectionRefusedError):
                mg.showerror('Ошибка', 'Хост ' + host + ' не доступен.')
                sys.exit()
            try:
                data = sock.recv(1024)
            except(OSError):
                mg.showerror('Ошибка', 'Не удалось получить данные с удаленного хоста.')
                sys.exit()
            data = data.decode()
            if 'False' in data:
                client_authentication.authentication_gui()
            # Записываем в список все данные от хоста
            len_pack = re.findall('\d+', data)
            if not len_pack:
                mg.showerror('Ошибка', 'Не удалось получить данные с удаленного хоста')
                sys.exit()
            if inet == 0:
                sock.send(bytes('Подтверждение от машины с ID ' + address + ' время ' + now + ' ' + ip_address, 'UTF-8'))
            else:
                mg.showerror('Ошибка', 'Хост 8.8.8.8 не доступен. Нет интернета.')
                sys.exit()
            sock.close()
            time.sleep(60)

Офлайн

#2 Сен. 12, 2019 17:42:13

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как уменьшить потребление памяти

regnor
В данный момент он жрет около 14 мегабайт
А ничего, что начисто запущеный интерпретатор питона со всеми импортированными библиотеками из вашего примера отжирает 11.5?




Офлайн

#3 Сен. 13, 2019 09:09:01

regnor
Зарегистрирован: 2017-08-16
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как уменьшить потребление памяти

Ок я понял вопрос снят, спасибо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version