Синхронізація та комунікація
Свайпніть щоб показати меню
Під час роботи з потоками або процесами часто виникає необхідність спільного використання даних або координації їхніх дій. Без належної синхронізації два потоки можуть одночасно намагатися змінити одну й ту ж змінну, що призводить до непередбачуваних результатів, відомих як стани гонки. Щоб запобігти цьому, Python надає примітиви синхронізації, такі як блокування (locks), черги (queues) та спільна пам’ять (shared memory).
Блокування (lock) — це простий механізм, який гарантує, що лише один потік може отримати доступ до певного коду або даних одночасно. Якщо один потік захоплює блокування, інші потоки, які намагаються його отримати, повинні чекати, поки воно не буде звільнене. Це запобігає конфліктним змінам з боку кількох потоків.
Черги (queues) — ще один потужний інструмент для безпечної комунікації між потоками та процесами. Черга дозволяє одному потоку або процесу безпечно додавати дані, а іншому — їх забирати. Класи queue.Queue (для потоків) та multiprocessing.Queue (для процесів) автоматично забезпечують необхідне блокування, тому вам не потрібно турбуватися про стани гонки.
За допомогою спільної пам’яті (shared memory) процеси можуть напряму отримувати доступ до одних і тих же даних, але для уникнення конфліктів необхідно використовувати примітиви синхронізації, такі як блокування або семафори. У більшості випадків для міжпроцесної комунікації простіше й безпечніше використовувати черги.
Відео вище демонструє, як блокування може запобігти пошкодженню спільних даних двома потоками, а також як черга дозволяє безпечно передавати дані між паралельними завданнями.
1234567891011121314151617181920212223import 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.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат