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

Min*_*hen 6 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

nox*_*fox 5

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

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

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

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