Введение
Войдите в мир, в котором промышленная революция преобразовала общество, и сует nineteentого века Викторианской эры образует жизни каменных улиц. Здесь, среди туманных переулков, полных шумов фуражей и далекого шума фабричной machinery, живет персонаж, чья талант пленяет толпу народа - артист на улице, известный своей невероятной способностью multitask.
Наша артист, по имени Оливер, известен juggling объектов, в то время как балансирует на монокиле, играет на гармошке и решает сложные загадки одновременно. Для удивления его аудитории, выступления Оливер seamless и эффективны, свидетельством его мастерства параллельных активностей. Эта лаборатория имеет целью отражать multitasking могущество Оливер, погружаясь в Python multithreading и multiprocessing возможностей, обеспечивая, чтобы coders могут управлять несколькими задачами одновременно без hitch.
Введение в потоки
В этом разделе вы узнаете основы многопоточности в Python. Многопоточность позволяет выполнять несколько операций одновременно, что делает вашу программу похожей на то, что она делает сразу несколько вещей, точно так же, как способность Оливера耍杂技,одновременно держа несколько предметов в руках.
Откройте файл с именем simple_threads.py в каталоге ~/project с таким содержанием:
import threading
import time
def print_numbers():
for i in range(1, 6):
time.sleep(1)
print(i)
## Создайте два потока
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_numbers)
## Запустите оба потока
thread1.start()
thread2.start()
## Подождите, пока оба потока завершатся
thread1.join()
thread2.join()
print("Done with numbers!")
Запустите вышеуказанный код в терминале с помощью:
python simple_threads.py
Вы должны увидеть, что числа выводятся из обоих потоков чередуящимися, а затем выводится сообщение "Done with numbers!":
1
1
2
2
3
3
4
4
5
5
Done with numbers!
Использование многопроцессорности
Теперь давайте используем многопроцессорность для ускорения вычислений. Многопроцессорность в Python позволяет выполнять несколько процессов, которые могут запускаться на разных ядрах CPU, уменьшая общее время, требуемое для задач, связанных с CPU.
Откройте файл с именем process_prime.py в каталоге ~/project с таким содержанием:
from multiprocessing import Process
import math
def is_prime(num):
"""
Проверьте, является ли число простым.
"""
if num <= 1:
return False
for i in range(2, int(math.sqrt(num)) + 1):
if num % i == 0:
return False
return True
def compute_primes(start, end):
"""
Найдите простые числа в заданном диапазоне.
"""
prime_numbers = [num for num in range(start, end) if is_prime(num)]
print(f"Простые числа в диапазоне {start}-{end}: {prime_numbers}")
processes = []
## Создаем два процесса
for i in range(0, 20000, 10000):
## Создайте новый процесс, нацеленный на функцию compute_primes и передайте диапазон в качестве аргументов
p = Process(target=compute_primes, args=(i, i+10000))
processes.append(p)
## Запустите процесс
p.start()
## Подождите, пока все процессы завершатся
for p in processes:
p.join()
print("Завершено вычисление простых чисел!")
Выполните скрипт в терминале:
python process_prime.py
Это выведет простые числа, найденные в указанных диапазонах, и выведет сообщение о завершении:
Простые числа в диапазоне 0-10000: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241,
......
9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973]
Простые числа в диапазоне 10000-20000: [10007, 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, 10181, 10193,
......
19739, 19751, 19753, 19759, 19763, 19777, 19793, 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, 19993, 19997]
Завершено вычисление простых чисел!
Резюме
В этом эксперименте мы начали увлекательное путешествие, чтобы раскрыть тонкости многопоточности и многопроцессорности в Python, подобно многоуровневым выступлениям викторийских артистов на улице. Мы начали с выполнения нескольких задач одновременно с помощью потоков, а затем перешли к обработке более сложных операций на различных ядрах CPU. Эта практика не только продемонстрировала параллельные возможности Python, но и показала, как эти методы имеют реальное значение в мире, подобно многосторонним навыкам нашего героя, Оливера.
Ваши выводы из этого эксперимента должны включать четкое понимание использования потоков Python для задач, связанных с вводом-выводом, и процессов для задач, связанных с CPU, что эффективно повышает производительность вашего кода и делает ваши приложения более эффективными.



