【发布时间】:2010-02-12 22:11:06
【问题描述】:
我有一个IronPython script,它使用 TPL 和 Parallel.ForEach 使用多个线程处理文件。在 C# 中,我可以使用 Interlocked.Add 和 Interlocked.Increment 在原子线程安全操作中更改全局变量,但这在 IronPython 中不起作用,因为integers are immutable。我目前有一个简单的 Results 类,它将一些变量存储为静态成员,用于跟踪多线程操作的结果。更改多个值时,我可以使用 .NET Monitor 类锁定类以确保更新是线程安全的,但如果我只想更新单个变量(比如只增加 Results.Files),这似乎是一个很大的开销.
我的问题是,是否有更好的方法以类似于 Interlocked.Increment 的工作原理的线程安全或原子方式递增单个静态成员变量(如 IronPython 中的 Results.Files)?或者,是否有任何内置于 python 或 .NET 框架中的线程安全计数器可以用来代替基本整数?
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
【问题讨论】:
-
我找到了一种解决方法(参见codeblog.theg2.net/2010/02/…),但我仍然有兴趣听到替代方案,或者是否可以使用 IronPython 的 Interlocked 类。
标签: .net multithreading ironpython