为什么这个多线程示例程序不能运行?

问题描述 投票:0回答:1

这是一个最小的Python程序,应该在一个线程中设置一个哨兵标志,并让该哨兵在另一个线程中读取并执行操作。

一些注意事项:

  1. 这是最小的。我省略了互斥体、线程安全等
  2. 我使用了一个可怕的全局变量来共享状态。真正的程序将传递一个共享类

程序创建一个生成器线程,该线程调用 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()
python multithreading python-multithreading
1个回答
0
投票

使用

multiprocessing
模块时,每个进程的内存是独立的 - 它们不直接共享变量或其他东西。代码中的
generator
listener
进程都有自己的
gStatusHolder
对象副本。

尝试使用

multiprocessing.Value
跨代码共享对象。

© www.soinside.com 2019 - 2024. All rights reserved.