Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions ProcessPoolExecutor.py
Original file line number Diff line number Diff line change
@@ -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()
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 &mdash; односторонняя функция, мы не можем по ее результату судить об аргументе, найти монеты мы можем только одим способом &mdash; перебором.
Expand Down Expand Up @@ -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 с
18 changes: 18 additions & 0 deletions ThreadPoolExecutor.py
Original file line number Diff line number Diff line change
@@ -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)