Механизми за синхронизиране на нишки на Python

В тази статия ще разгледаме как да синхронизираме достъпа до споделени ресурси, както и как да координираме изпълнението на нишките.

Синхронизиране на достъпа до споделени ресурси

Един важен проблем при използване потоци, избягването на конфликти, когато повече от една нишка трябва да имат достъп до една и съща променлива или ресурс. Ако не сте внимателни, припокриващите се достъпи или модификации от множество нишки могат да доведат до много различни проблеми и най-лошото от всичко е, че тези проблеми обикновено се появяват само при голямо натоварване или на вашите производствени сървъри или на по-бързия хардуер, който се използва. един от вашите потребители. Например, помислете за програма, която изпълнява определен процес и следи колко пъти е бил изпълнен този процес:

Ако извикате тази функция от повече от една нишка, ще установите, че броенето не е много точно. Това работи в повечето случаи, но понякога могат да възникнат проблеми. Това е така, защото допълнителни операции се извършват на три етапа. В първата стъпка преводачът извлича текущата стойност на брояча, след което изчислява новата стойност и накрая, въвежда нова стойност обратно към променлива.

Ако друг поток спечелете контрол след текущ поток извлечена променлива, тя може да извлече променливата, да я увеличи и да я запише обратно, преди текущата нишка да направи същото. И тъй като и двамата виждат едно и също първоначално значение, само един от потоците ще получи достъп до него.
Друг проблем е достъпът до непълно или непоследователно състояние, което може да се случи, ако една от нишките инициализира или актуализира нетривиална структура от данни, докато другата нишка се опитва да прочете структурата, докато тя се актуализира.