diff --git a/CPU-bound.py b/CPU-bound.py new file mode 100644 index 0000000..8915bf0 --- /dev/null +++ b/CPU-bound.py @@ -0,0 +1,26 @@ +import concurrent.futures +from hashlib import md5 +from random import choice +from time import time + + +def is_prime(n): + while True: + s = "".join([choice("0123456789") for i in range(50)]) + h = md5(s.encode('utf8')).hexdigest() + + if h.endswith("00000"): + return s + ',' + h + + +def main(): + with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor: + for answer in zip(executor.map(is_prime, range(3))): + print(answer) + + +if __name__ == '__main__': + time1 = time() + main() + time2 = time() + print(time2 - time1) diff --git a/REPORT.md b/REPORT.md new file mode 100644 index 0000000..28a95ea --- /dev/null +++ b/REPORT.md @@ -0,0 +1,115 @@ +# Параллелизм и асинхронность +## IO-bound. Проверяем ссылки на страницах Википедии +### синхронно в 1 поток: + +Время выполнения: + +![image](/images/1.bmp) +Заняло около 22 минут + +Диспетчер задач: + +![image](/images/2.bmp) + + +### С помощью ThreadPoolExecutor: +* 5 воркеров + +Время выполнения: + +![image](/images/3.bmp) +Около 5 минут + +Диспетчер задач: + +![image](/images/4.bmp) + +* 10 воркеров: + +Время выполнения: + +![image](/images/5.bmp) +около 4 минут + +Диспетчер задач: + +![image](/images/6.bmp) + +* 100 воркеров: + +Время выполнения: + +![image](/images/7.bmp) +около 3 минут + +Диспетчер задач: + +![image](/images/8.bmp) + +### Вывод: +Использование памяти значительно разнится в сравнение с одним потоком, если сравнивать с разными значениями(5, 10, 100), то разница практически не заметна. При использовании ThreadPoolExecutor уменьшилось время выполнения. + +## CPU-bound. Генерируем монетки + +* На 1 ядре: + +Время выполнения: + +![image](/images/9.bmp) +около 2 минут + +Диспетчер задач: + +![image](/images/10.bmp) + +* 2 воркера: + +Время выполнения: + +![image](/images/11.bmp) +около 2 минут + +Диспетчер задач: + +![image](/images/12.bmp) + +* 4 воркера: + +Время выполнения: + +![image](/images/13.bmp) +около 2 минут + +Диспетчер задач: + +![image](/images/14.bmp) + +* 5 воркеров: + +Время выполнения: + +![image](/images/15.bmp) +меньше минуты + +Диспетчер задач: + +![image](/images/16.bmp) + +* 10 воркеров: + +Время выполнения: + +![image](/images/17.bmp) +около минуты + +Диспетчер задач: + +![image](/images/18.bmp) + +* 100 воркеров: +* ошибка + +![image](/images/19.bmp) + +### Вывод: +При использовании одного ядра нагрузка была несильной. При использовании ProcessPoolExecutor время сократилось. При увеличении воркеров нагрузка на ЦП немного увеличивалась. Есть некоторая погрешность в значениях, так как нагрузка была неоднозначной. diff --git a/images/1.bmp b/images/1.bmp new file mode 100644 index 0000000..52db109 Binary files /dev/null and b/images/1.bmp differ diff --git a/images/10.bmp b/images/10.bmp new file mode 100644 index 0000000..bafc0ad Binary files /dev/null and b/images/10.bmp differ diff --git a/images/11.bmp b/images/11.bmp new file mode 100644 index 0000000..b723287 Binary files /dev/null and b/images/11.bmp differ diff --git a/images/12.bmp b/images/12.bmp new file mode 100644 index 0000000..e29c9d9 Binary files /dev/null and b/images/12.bmp differ diff --git a/images/13.bmp b/images/13.bmp new file mode 100644 index 0000000..4f765ba Binary files /dev/null and b/images/13.bmp differ diff --git a/images/14.bmp b/images/14.bmp new file mode 100644 index 0000000..d8fa6bd Binary files /dev/null and b/images/14.bmp differ diff --git a/images/15.bmp b/images/15.bmp new file mode 100644 index 0000000..a973e74 Binary files /dev/null and b/images/15.bmp differ diff --git a/images/16.bmp b/images/16.bmp new file mode 100644 index 0000000..02dcf16 Binary files /dev/null and b/images/16.bmp differ diff --git a/images/17.bmp b/images/17.bmp new file mode 100644 index 0000000..db0f6ba Binary files /dev/null and b/images/17.bmp differ diff --git a/images/18.bmp b/images/18.bmp new file mode 100644 index 0000000..9f1d354 Binary files /dev/null and b/images/18.bmp differ diff --git a/images/19.bmp b/images/19.bmp new file mode 100644 index 0000000..92febff Binary files /dev/null and b/images/19.bmp differ diff --git a/images/2.bmp b/images/2.bmp new file mode 100644 index 0000000..4e592f7 Binary files /dev/null and b/images/2.bmp differ diff --git a/images/3.bmp b/images/3.bmp new file mode 100644 index 0000000..c1da657 Binary files /dev/null and b/images/3.bmp differ diff --git a/images/4.bmp b/images/4.bmp new file mode 100644 index 0000000..943d84e Binary files /dev/null and b/images/4.bmp differ diff --git a/images/5.bmp b/images/5.bmp new file mode 100644 index 0000000..73e84bd Binary files /dev/null and b/images/5.bmp differ diff --git a/images/6.bmp b/images/6.bmp new file mode 100644 index 0000000..c124f97 Binary files /dev/null and b/images/6.bmp differ diff --git a/images/7.bmp b/images/7.bmp new file mode 100644 index 0000000..6e52841 Binary files /dev/null and b/images/7.bmp differ diff --git a/images/8.bmp b/images/8.bmp new file mode 100644 index 0000000..531c4d0 Binary files /dev/null and b/images/8.bmp differ diff --git a/images/9.bmp b/images/9.bmp new file mode 100644 index 0000000..f10ec47 Binary files /dev/null and b/images/9.bmp differ diff --git a/wiki.py b/wiki.py new file mode 100644 index 0000000..f6727b0 --- /dev/null +++ b/wiki.py @@ -0,0 +1,22 @@ +import urllib.request +from urllib.parse import unquote +import concurrent.futures + +links = open('res.txt', encoding='utf8').read().split('\n') + + +def load_url(link, timeout): + with urllib.request.urlopen(link, timeout=timeout) as conn: + return conn.code + + +with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: + future_to_url = {executor.submit(load_url, url, 5): 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('%r exception: %s' % (url, e)) + else: + print(data) \ No newline at end of file