Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Синхронізація та комунікація | Багатопотоковість vs. Багатопроцесність
Структурне програмування на Python

Синхронізація та комунікація

Свайпніть щоб показати меню

Під час роботи з потоками або процесами часто виникає необхідність спільного використання даних або координації їхніх дій. Без належної синхронізації два потоки можуть одночасно намагатися змінити одну й ту ж змінну, що призводить до непередбачуваних результатів, відомих як стани гонки. Щоб запобігти цьому, Python надає примітиви синхронізації, такі як блокування (locks), черги (queues) та спільна пам’ять (shared memory).

Блокування (lock) — це простий механізм, який гарантує, що лише один потік може отримати доступ до певного коду або даних одночасно. Якщо один потік захоплює блокування, інші потоки, які намагаються його отримати, повинні чекати, поки воно не буде звільнене. Це запобігає конфліктним змінам з боку кількох потоків.

Черги (queues) — ще один потужний інструмент для безпечної комунікації між потоками та процесами. Черга дозволяє одному потоку або процесу безпечно додавати дані, а іншому — їх забирати. Класи queue.Queue (для потоків) та multiprocessing.Queue (для процесів) автоматично забезпечують необхідне блокування, тому вам не потрібно турбуватися про стани гонки.

За допомогою спільної пам’яті (shared memory) процеси можуть напряму отримувати доступ до одних і тих же даних, але для уникнення конфліктів необхідно використовувати примітиви синхронізації, такі як блокування або семафори. У більшості випадків для міжпроцесної комунікації простіше й безпечніше використовувати черги.

Відео вище демонструє, як блокування може запобігти пошкодженню спільних даних двома потоками, а також як черга дозволяє безпечно передавати дані між паралельними завданнями.

1234567891011121314151617181920212223
import threading counter = 0 lock = threading.Lock() def increment(): global counter for _ in range(10000): with lock: # Ensuring only one thread enters this block at a time counter += 1 threads = [] for _ in range(5): t = threading.Thread(target=increment) threads.append(t) t.start() for t in threads: t.join() print("Final counter value:", counter) # Without the lock, the final value would likely be wrong due to race conditions. # With the lock, the result is always correct: 50000.
question mark

Який примітив синхронізації ви б використали для безпечного спільного використання даних між кількома потоками в Python?

Виберіть правильну відповідь

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 6

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Секція 3. Розділ 6
some-alt