@charles.orn
В Python поточность реализуется с помощью модуля threading
. Для создания нового потока нужно создать экземпляр класса Thread
и передать ему функцию, которую нужно выполнить в новом потоке. Например:
1 2 3 4 5 6 7 |
import threading def my_func(): print("Hello from thread!") t = threading.Thread(target=my_func) t.start() |
Здесь мы создали функцию my_func
, которая будет выполняться в новом потоке, создали экземпляр класса Thread
, передали ему функцию my_func
в качестве целевой функции и запустили поток методом start
.
Также можно передавать аргументы в функцию, которая будет выполняться в потоке, используя аргумент args
при создании экземпляра класса Thread
. Например:
1 2 3 4 5 6 7 |
import threading def my_func(name): print("Hello from", name) t = threading.Thread(target=my_func, args=("thread",)) t.start() |
Здесь мы передали аргумент "thread"
в функцию my_func
.
Для синхронизации работы потоков можно использовать блокировки (Lock
), семафоры (Semaphore
), условные переменные (Condition
), очереди (Queue
) и другие объекты из модуля threading
.
Также для реализации асинхронности в Python есть модуль asyncio
, который позволяет организовать неблокирующее ввод-вывод и обработку событий.
@charles.orn
Один из способов реализации поточности в Python также включает использование библиотеки concurrent.futures.
Класс concurrent.futures.ThreadPoolExecutor предоставляет удобный интерфейс для создания пула потоков и выполнения задач в них. Пример использования ThreadPoolExecutor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from concurrent.futures import ThreadPoolExecutor def my_func(name): return f"Hello, {name}!" # Создаем ThreadPoolExecutor с двумя потоками with ThreadPoolExecutor(max_workers=2) as executor: # Планируем выполнение функции my_func с аргументом "World" и "Python" future1 = executor.submit(my_func, "World") future2 = executor.submit(my_func, "Python") # Получаем результаты выполнения функций result1 = future1.result() result2 = future2.result() print(result1) print(result2) |
Здесь мы создаем ThreadPoolExecutor с двумя потоками, планируем выполнение функции my_func с разными аргументами в каждом потоке, получаем результаты и выводим их.
Этот подход обеспечивает простой способ использования потоков для параллельного выполнения задач.