Загрузка данных



import time
import threading
from concurrent.futures import ThreadPoolExecutor
from multiprocessing import Pool # для процессов
import math


def downloads(name):
    print("Начали загружать файл", name)
    time.sleep(1) # программа ост-я на 1 секунду
    print("Готово", name)

def practice_1():
    start = time.perf_counter()
    for i in range(5):
        downloads(i)
    print("Последовательно: ", time.perf_counter() - start)

    start = time.perf_counter()
    threads = [] # список потоков
    for i in range(5):
        t = threading.Thread(target=downloads, args=(i,)) # созадли поток
        t.start() # запустили
        threads.append(t)

    for t in threads:
        t.join() # ожидает завершения потока
    print(f"Параллельно: {time.perf_counter() - start}")

def practice_2():
    """работа с 1й переменной"""
    balance = [100]

    lock = threading.Lock()
    def wit(amount):
            if balance[0] >= amount: # мой баланс не может быть меньше 0
                time.sleep(0.0010) #е1 е2
                balance[0] = balance[0] - amount

    t1 = threading.Thread(target=wit, args=(100,))
    t2 = threading.Thread(target=wit, args=(100,))

    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print("C блокировкой", balance)


"""Пулл потоков"""
def fetch(url):
    time.sleep(1)
    return f"Данные с {url}"

def practice_3():
    urls = ["site1", "site2", "site3", "site4"]

    start = time.perf_counter()
    with ThreadPoolExecutor(max_workers=4) as executor:
        results = list(executor.map(fetch, urls))

    print(f"Время: {time.perf_counter() - start}")