Как правильно и просто реализовать поточность в python?

Пользователь

от charles.orn , в категории: Python , год назад

Как правильно и просто реализовать поточность в python?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от cierra , год назад

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

Пользователь

от karen.wisozk , 4 месяца назад

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


Этот подход обеспечивает простой способ использования потоков для параллельного выполнения задач.