这是一个最小的Python程序,应该在一个线程中设置一个哨兵标志,并让该哨兵在另一个线程中读取并执行操作。
一些注意事项:
程序创建一个生成器线程,该线程调用 ClassA 实例上的方法,该方法将定期将全局状态持有者 (gStatusHolder) 上的哨兵变量设置为 True
侦听器在调用侦听器方法的单独线程上启动。此方法定期检查全局哨兵变量是否为 True,如果是则打印一条消息并将其设置回 false
SetSentinel 方法确实会定期将全局标志设置为 True,但在侦听器方法中从未检测到这一点。 gStatusHolder.sentinelFlag 的值始终为 false。
这是为什么?
import time
from multiprocessing import Process, Lock
class StatusHolder:
sentinelFlag = False
gStatusHolder = StatusHolder()
class ClassA:
def SetSentinel(cls):
while True:
time.sleep(10)
gStatusHolder.sentinelFlag = True
print("Did you hear that?")
def generator(Alist):
Alist.SetSentinel()
def listener():
while True:
if gStatusHolder.sentinelFlag:
print("I heard!")
gStatusHolder.sentinelFlag = False
time.sleep(1)
def main():
listenerThread = Process(target=listener)
listenerThread.start()
A = ClassA()
generatorThread = Process(target=generator, args=(A,))
generatorThread.start()
while(True):
pass
if __name__ == "__main__":
main()
使用
multiprocessing
模块时,每个进程的内存是独立的 - 它们不直接共享变量或其他东西。代码中的 generator
和 listener
进程都有自己的 gStatusHolder
对象副本。
尝试使用
multiprocessing.Value
跨代码共享对象。