diff --git a/ProcessPoolExecutor.py b/ProcessPoolExecutor.py new file mode 100644 index 0000000..f6aedf1 --- /dev/null +++ b/ProcessPoolExecutor.py @@ -0,0 +1,23 @@ +import concurrent.futures, time +from hashlib import md5 +from random import choice + + +def coin_generator(quantity): + count = 0 + start_time = time.time() + while count < quantity: + s = "".join([choice("0123456789") for i in range(50)]) + h = md5(s.encode('utf8')).hexdigest() + if h.endswith("0000"): + count += 1 + print(s, h) + print(f"Время работы: {time.time() - start_time} секунд") + +def main(): + with concurrent.futures.ProcessPoolExecutor(max_workers=61) as executor: + coin_generator(5) + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/README.md b/README.md index 9bc87a8..5c55eb8 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,13 @@ for url in links: * Изменяйте количество воркеров: 5, 10, 100. * Во время работы посмотрите с использованием стандартных утилит вашей OC загрузку памяти, процессора, сети, время работы. Зависят ли они от количества воркеров и как? + +- Время синхронной проверки ссылок: 153.086 с +- Время работы с 5 воркерами: 48.378 с +- Время работы с 10 воркерами: 22.930 с +- Время работы с 100 воркерами: 9.071 с + + ## CPU-bound. Генерируем монетки Придумаем некоторый прототип криптовалюты, построенный на концепции [Proof of work](https://en.wikipedia.org/wiki/Proof_of_work). Монетой будет считаться некоторая строка длины 50 из последовательности цифр 0-9, у которой md5-hash заканчивается на `00000`. Так как md5 — односторонняя функция, мы не можем по ее результату судить об аргументе, найти монеты мы можем только одим способом — перебором. @@ -190,3 +197,9 @@ while True: * Во время работы посмотрите с использованием стандартных утилит вашей OC загрузку памяти, процессора, сети, время работы. Зависят ли они от количества воркеров и как? * Убедитесь в том, что так как задача CPU bound, наращивать количество воркеров, большее количества ядер, бесполезно. +- Время выполнения герации на 1 ядре: 227.032 с +- Время выполнения с использованием 2 воркеров: 135.394 с +- Время выполнения с использованием 4 воркеров: 68.127 с +- Время выполнения с использованием 5 воркеров: 62.489 с +- Время выполнения с использованием 10 воркеров: 113.893 с +- Время выполнения с использованием 61 воркера: 118.129 с diff --git a/ThreadPoolExecutor.py b/ThreadPoolExecutor.py new file mode 100644 index 0000000..3383726 --- /dev/null +++ b/ThreadPoolExecutor.py @@ -0,0 +1,18 @@ +import concurrent.futures, urllib, urllib.request + + +def get_url(url, timeout): + with urllib.request.urlopen(url, timeout=timeout) as conn: + return conn.read() + + +links = open('links.txt', encoding='utf8').read().split('\n') + +with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor: + future_to_url = {executor.submit(get_url, url, 60): url for url in links} + for future in concurrent.futures.as_completed(future_to_url): + url = future_to_url[future] + try: + data = future.result() + except Exception as e: + print(url, e) \ No newline at end of file