Ответ
В Python работа с потоками реализована через модуль threading. Ключевой особенностью является наличие GIL (Global Interpreter Lock) — механизма, который позволяет только одному потоку исполнять Python-байт-код в один момент времени в рамках одного процесса.
Последствия GIL:
- Для I/O-bound задач (работа с сетью, файлами): Потоки эффективны. Пока один поток ждет ответа от сети, GIL освобождается, и другой поток может выполнять свою работу.
- Для CPU-bound задач (вычисления): Потоки не дают прироста производительности на многоядерных системах, так как только одно ядро может быть утилизировано в один момент времени. Для таких задач следует использовать модуль
multiprocessing.
Пример создания потока:
import threading
import time
def worker(name):
print(f"Поток {name} запущен")
time.sleep(1)
print(f"Поток {name} завершен")
# Создаем и запускаем поток
thread = threading.Thread(target=worker, args=("Worker-1",))
thread.start()
print("Главный поток продолжает работу")
# Ожидаем завершения дочернего потока
thread.join()
print("Программа завершена")
Ключевые моменты:
- Общая память: Потоки разделяют общее пространство памяти, что упрощает обмен данными, но требует механизмов синхронизации (
Lock,Semaphore) для предотвращения состояния гонки. - Демонические потоки: Потоки, созданные с флагом
daemon=True, автоматически завершаются при выходе из основного потока.