Многопоточность — это одновременное выполнение нескольких потоков в одном процессе. В Python для работы с многопоточностью используется модуль threading
. В данной статье мы рассмотрим основы работы с многопоточностью и покажем примеры кода.
Создание потоков
Для создания потока вы можете использовать класс Thread
из модуля threading
. Вот пример создания и запуска двух потоков:
import threading def print_numbers(): for i in range(10): print(i) def print_letters(): for letter in 'abcdefghij': print(letter) # Создаем потоки thread1 = threading.Thread(target=print_numbers) thread2 = threading.Thread(target=print_letters) # Запускаем потоки thread1.start() thread2.start() # Ждем завершения потоков thread1.join() thread2.join()
В этом примере два потока выполняют функции print_numbers
и print_letters
одновременно. Вызов метода start()
запускает поток, а метод join()
блокирует выполнение основного потока до завершения вызываемого потока.
Синхронизация потоков
При работе с многопоточностью важно обеспечить синхронизацию данных между потоками. Для этого в Python используются блокировки (Locks). Вот пример использования блокировок:
import threading # Создаем блокировку lock = threading.Lock() def safe_print(item): with lock: print(item) def print_numbers(): for i in range(10): safe_print(i) def print_letters(): for letter in 'abcdefghij': safe_print(letter) # Создаем потоки thread1 = threading.Thread(target=print_numbers) thread2 = threading.Thread(target=print_letters) # Запускаем потоки thread1.start() thread2.start() # Ждем завершения потоков thread1.join() thread2.join()
В этом примере мы создали блокировку lock
и использовали ее в функции safe_print()
для синхронизации доступа к функции print()
. Таким образом, потоки не будут конфликтовать при выводе данных.
Работа с ThreadPoolExecutor
Для упрощения работы с потоками вы можете использовать класс ThreadPoolExecutor
из модуля concurrent.futures
. Вот пример использования ThreadPoolExecutor
для выполнения задач параллельно:
from concurrent.futures import ThreadPoolExecutor def square(x): return x * x # Создаем ThreadPoolExecutor с 4-мя потоками with ThreadPoolExecutor(max_workers=4) as executor: # Запускаем задачи и получаем результаты results = list(executor.map(square, range(10))) print(results)
В этом примере мы создали ThreadPoolExecutor
с 4 потоками и использовали метод map()
для выполнения функции square()
с аргументами от 0 до 9. Результаты выполнения функции собираются в список.
Теперь вы знаете основы работы с многопоточностью в Python и можете применять эти знания на практике. Удачного кодирования! 😉
Добавить комментарий