@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 с разными аргументами в каждом потоке, получаем результаты и выводим их.
Этот подход обеспечивает простой способ использования потоков для параллельного выполнения задач.