问题描述
cpython中的id返回给定对象的指针。由于线程具有共享的地址空间,因此将在两个不同的位置分配对象的两个不同实例,并返回两个不同的ID(又称为虚拟地址指针)。
拥有自己的地址空间的单独进程不是这种情况。偶然地,它们碰巧获得了相同的地址指针。
请记住,地址指针是虚拟的,因此它们表示进程地址空间本身内的偏移量。这就是为什么它们相同的原因。
通常最好不要依靠id()来区分对象,因为新对象可能会获得旧对象的ID,从而随着时间的推移很难跟踪它们。通常会导致棘手的错误。
解决方法
使用多处理模块时,我试图在流程中创建一个新对象。但是,有些事情使我感到困惑。
当我使用多处理模块时,新对象的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
我想知道为什么它们不同。