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

Why do new objects in multiprocessing have the same id?(为什么多处理中的新对象具有相同的 id?)
本文介绍了为什么多处理中的新对象具有相同的 id?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我尝试在使用多处理模块时在进程中创建新对象.但是,有些事情让我感到困惑.

I tried to create a new object in a process when using multiprocessing module. However, something confuses me.

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

When I use multiprocessing module, the id of the new object is the same

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

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

But when I use threading, they are different:

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

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

I am wondering why they are different.

推荐答案

idCPython 中的 返回给定对象的指针.由于线程共享地址空间,一个对象的两个不同实例将被分配在两个不同的位置,返回两个不同的 id(也称为虚拟地址指针).

id in CPython returns the pointer of the given object. As threads have shared address space, two different instances of an object will be allocated in two different locations returning two different ids (aka virtual address pointers).

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

This is not the case for separate processes which own their own address space. By chance, they happen to get the same address pointer.

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

Keep in mind that address pointers are virtual, therefore they represent an offset within the process address space itself. That's why they are the same.

通常最好不要依赖 id() 来区分对象,因为新对象可能会得到旧对象的 id,随着时间的推移很难跟踪它们.它通常会导致棘手的错误.

It is usually better not to rely on id() for distinguishing objects, as new ones might get ids of old ones making hard to track them over time. It usually leads to tricky bugs.

这篇关于为什么多处理中的新对象具有相同的 id?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

build conda package from local python package(从本地 python 包构建 conda 包)
How can I see all packages that depend on a certain package with PIP?(如何使用 PIP 查看依赖于某个包的所有包?)
How to organize multiple python files into a single module without it behaving like a package?(如何将多个 python 文件组织到一个模块中而不像一个包一样?)
Check if requirements are up to date(检查要求是否是最新的)
How to upload new versions of project to PyPI with twine?(如何使用 twine 将新版本的项目上传到 PyPI?)
Why #egg=foo when pip-installing from git repo(为什么从 git repo 进行 pip 安装时 #egg=foo)