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
36 changes: 36 additions & 0 deletions CPU-bound.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import concurrent.futures
from hashlib import md5
from random import choice

from benchmark import function_time


def main():
get_coins_async(3, 61)


@function_time
def get_coins_async(count, max_workers=None):
with concurrent.futures.ProcessPoolExecutor(max_workers=max_workers) as executor:
futures = [executor.submit(get_coin) for _ in range(count)]
for future in concurrent.futures.as_completed(futures):
print(future.result())


@function_time
def get_coins(count):
for _ in range(count):
print(get_coin())


def get_coin():
while True:
s = "".join([choice("0123456789") for i in range(50)])
h = md5(s.encode('utf8')).hexdigest()

if h.endswith("00000"):
return s, h


if __name__ == '__main__':
main()
37 changes: 37 additions & 0 deletions IO-bound.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import concurrent.futures
from urllib.request import urlopen

from benchmark import function_time


def main():
links = open('res.txt', encoding='utf8').read().split('\n')
check_links_async(links, 5, max_workers=100)


@function_time
def check_links_async(links, timeout, max_workers=None):
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
future_to_url = {executor.submit(get_http_status_code, url, timeout): url for url in links}
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
try:
print(future.result())
except Exception as e:
print(url, e)


@function_time
def check_links(links, timeout):
for link in links:
code = get_http_status_code(link, timeout)
print(code)


def get_http_status_code(url, timeout):
with urlopen(url, timeout=timeout) as resp:
return resp.code


if __name__ == '__main__':
main()
17 changes: 13 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,9 +151,12 @@ for url in links:
print(url, e)
```

* Замерьте время синхронной проверки ссылок.
* Замерьте время синхронной проверки ссылок - 1440.4963843 сек.
* Перепишите код, используя `ThreadPoolExecutor`.
* Изменяйте количество воркеров: 5, 10, 100.
* Изменяйте количество воркеров:
* 5 - 279.92080426216125 сек,
* 10 - 121.93024277687073 сек,
* 100 - 68.77614498138428 сек.
* Во время работы посмотрите с использованием стандартных утилит вашей OC загрузку памяти, процессора, сети, время работы. Зависят ли они от количества воркеров и как?

## CPU-bound. Генерируем монетки
Expand Down Expand Up @@ -184,9 +187,15 @@ while True:

У нас отсутсвует Блокчейн, то есть мы не можем доказать, что монета была сгенерирована именно нами или принадлежит нам: если мы кому-то ее покажем, ее тут же украдут. Эту часть мы оставим за рамками задания.

* Замерьте скорость герации на 1 ядре у вас на компьютере.
* Кол-во монет = 3
* Замерьте скорость герации на 1 ядре у вас на компьютере - 65.92334866523743 сек.
* Ускорьтесь за счет использования `ProcessPoolExecutor`.
* Изменяйте количество воркеров: 2, 4, 5, 10, 100.
* Изменяйте количество воркеров:
* 2 - 49.83474016189575 сек,
* 4 - 18.648980140686035 сек,
* 5 - 57.53911590576172 сек,
* 10 - 86.36013913154602 сек,
* 100 - 86.56070685386658 сек.
* Во время работы посмотрите с использованием стандартных утилит вашей OC загрузку памяти, процессора, сети, время работы. Зависят ли они от количества воркеров и как?
* Убедитесь в том, что так как задача CPU bound, наращивать количество воркеров, большее количества ядер, бесполезно.

11 changes: 11 additions & 0 deletions benchmark.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import time


def function_time(function):
def wrapped(*args):
start_time = time.time()
res = function(*args)
print(f'Время работы функции: {time.time() - start_time} сек')
return res

return wrapped
17 changes: 17 additions & 0 deletions links_finder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from urllib.request import urlopen
from bs4 import BeautifulSoup
from tqdm import tqdm

url = 'https://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%A1%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0'

res = open('res.txt', 'w', encoding='utf8')

for i in tqdm(range(100)):
html = urlopen(url).read().decode('utf8')
soup = BeautifulSoup(html, 'html.parser')
links = soup.find_all('a')

for l in links:
href = l.get('href')
if href and href.startswith('http') and 'wiki' not in href:
print(href, file=res)
Loading