【发布时间】:2019-09-19 13:11:36
【问题描述】:
我正在编写一些代码,其中一个线程使用一个类的 setter,另一个线程使用同一个类的 getter。
我的问题是我需要使用锁还是线程同时调用getter和setter时没有问题?
【问题讨论】:
-
简短的回答是,是的,尽管有 python 的 GIL,但您可能需要在多线程程序中使用锁。
标签: python multithreading locks
我正在编写一些代码,其中一个线程使用一个类的 setter,另一个线程使用同一个类的 getter。
我的问题是我需要使用锁还是线程同时调用getter和setter时没有问题?
【问题讨论】:
标签: python multithreading locks
锁最重要的用例是,当线程 A 正在修改数据时,防止线程 B、C 和 D 看到某些处于不一致或无效状态的共享数据集合。
GIL 不会阻止这种情况发生,因为 GIL 不会阻止线程被抢先调度。
“setters”和“getters”是不相关的。关键是,您有不同的线程访问共享的变量。如果这些变量中的任何一个与其他任何变量有重要关系,并且如果更新它们的线程必须暂时中断这种关系,那么您需要锁定。如果没有锁,调度程序可以“交换”暂时中断关系的线程,而其他一些线程可以看到处于“中断”状态的变量。
锁不会阻止调度程序在任何时候“换出”任何线程,但它会阻止其他线程在第一个线程再次运行之前看到混乱,清理乱七八糟,然后解锁。
【讨论】: