为什么多处理中的新对象具有相同的ID?

时间:2015-11-12 00:15:39

标签: python multiprocessing

我尝试在使用多处理模块时在进程中创建一个新对象。然而,有些事让我困惑。

当我使用多处理模块时,新对象的id是相同的

for i in range(4):
    p = multiprocessing.Process(target=worker)
    p.start()

def worker():
    # stanford named entity tagger
    st = StanfordNERTagger(model_path,stanford_ner_path)
    print id(st)    # all the processes print the same id

但是当我使用线程时,它们是不同的:

for i in range(4):
    p = threading.Thread(target=worker)
    p.start()

def worker():
    # stanford named entity tagger
    st = StanfordNERTagger(model_path,stanford_ner_path)
    print id(st)    # threads print differnt ids

我想知道为什么他们不同。

1 个答案:

答案 0 :(得分:5)

CPython中的

id返回给定对象的指针。由于线程具有共享地址空间,因此将在两个不同的位置分配两个不同的对象实例,返回两个不同的ID(即虚拟地址指针)。

对于拥有自己的地址空间的单独进程,情况并非如此。碰巧,他们碰巧得到了相同的地址指针。

请记住,地址指针是虚拟的,因此它们代表了进程地址空间本身的偏移量。这就是为什么他们是一样的。

通常最好不要依赖id()来区分对象,因为新的可能会让旧的id很难跟踪它们。它通常会导致棘手的错误。