我是否应该使用锁来写入 class 变量(在线程处理期间),即使每个变量未被其他线程 accessed/written 写入?
Should I use a lock to write to class variables (during threading) even if each variable is not accessed/written into by other threads?
我有一个 class 可以解析很多字符串。有 6 个主要变量被 6 个线程写入。所有字符串的总字符数将超过 500,000 个字符。
每个线程独立工作,即它们的所有字符串都不会与其他字符串冲突或被其他字符串引用。这意味着所有线程在输入方面相互排斥,在输出时,它们只写入 class.
中的变量
我是否应该在写入这些变量的过程中在 class 中实施锁定机制?
EDIT1:完成穿线。但是,为了比较执行速度,我 运行 也都是同时进行的。我发现 运行 顺序时需要 1.44 秒,线程时需要 2.33 秒。我做错了什么?
如果每个线程访问的内存是独立的那么你不需要任何同步。如果您计划之后从主线程访问这些结果,则最后需要进行一些同步,但等待工作线程完成就足够了。
这是一般的答案。 Python 的线程由于 GIL 而受到限制,因此您可能根本不需要任何东西。您也不会看到预期的加速。
如果您的 class 级变量被所有线程更新,您需要使用 class 级锁,如下所示。
class Parser(object):
sharedLock = threading.Lock()
var1 = var2 = var3 = var4 = var5 = var6 = 0
@classmethod
def update(cls):
with cls.sharedLock:
# update your variables.
我有一个 class 可以解析很多字符串。有 6 个主要变量被 6 个线程写入。所有字符串的总字符数将超过 500,000 个字符。
每个线程独立工作,即它们的所有字符串都不会与其他字符串冲突或被其他字符串引用。这意味着所有线程在输入方面相互排斥,在输出时,它们只写入 class.
中的变量我是否应该在写入这些变量的过程中在 class 中实施锁定机制?
EDIT1:完成穿线。但是,为了比较执行速度,我 运行 也都是同时进行的。我发现 运行 顺序时需要 1.44 秒,线程时需要 2.33 秒。我做错了什么?
如果每个线程访问的内存是独立的那么你不需要任何同步。如果您计划之后从主线程访问这些结果,则最后需要进行一些同步,但等待工作线程完成就足够了。
这是一般的答案。 Python 的线程由于 GIL 而受到限制,因此您可能根本不需要任何东西。您也不会看到预期的加速。
如果您的 class 级变量被所有线程更新,您需要使用 class 级锁,如下所示。
class Parser(object):
sharedLock = threading.Lock()
var1 = var2 = var3 = var4 = var5 = var6 = 0
@classmethod
def update(cls):
with cls.sharedLock:
# update your variables.