У меня есть сценарий IronPython , который использует TPL и Parallel.ForEach для обработки файлов с использованием нескольких потоков. В C # я могу использовать Interlocked.Add и Interlocked.Increment для изменения глобальных переменных в атомарной поточно-ориентированной операции, но это не работает в IronPython, потому что целые числа неизменны . В настоящее время у меня есть простой класс Results, который хранит несколько переменных в виде статических членов, которые используются для отслеживания результатов многопоточной операции. При изменении нескольких значений я могу заблокировать класс с помощью класса .NET Monitor , чтобы гарантировать, что обновление является поточно-ориентированным, но это выглядит слишком затратно, если я хочу обновить только одну переменную (например, просто увеличить Results.Files).
У меня вопрос: есть ли лучший способ увеличить одну статическую переменную-член, такую как Results.Files в IronPython, потокобезопасным или атомарным способом, аналогичным тому, как работает Interlocked.Increment? В качестве альтернативы есть какие-нибудь поточно-безопасные счетчики, встроенные в python или .NET Framework, которые можно использовать вместо базового целого числа?
class Results:
Files = 0
Lines = 0
Tolkens = 0
@staticmethod
def Add(intFiles, intLines, intTolkens):
#Use the System.Threading.Monitor class to ensure addition is thread safe
Monitor.Enter(Results)
Results.Files += intFiles
Results.Lines += intLines
Results.Tolkens += intTolkens
Monitor.Exit(Results) #Finish thread safe code