使用多处理模块时,我试图在流程中创建一个新对象。但是,有些事情使我感到困惑。
当我使用多处理模块时,新对象的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
我想知道为什么它们不同。
CPython中的id返回给定对象的指针。由于线程具有共享的地址空间,因此将在两个不同的位置分配对象的两个不同实例,并返回两个不同的ID(又称为虚拟地址指针)。
拥有自己的地址空间的单独进程不是这种情况。偶然地,它们碰巧获得了相同的地址指针。
请记住,地址指针是虚拟的,因此它们表示进程地址空间本身内的偏移量。这就是为什么它们相同的原因。
通常最好不要依靠id()来区分对象,因为新对象可能会获得旧对象的ID,从而随着时间的推移很难跟踪它们。通常会导致棘手的错误。
问题内容: 在以下代码中,我不明白为什么当它属于两个不同的对象时具有相同的ID? 问题答案: 我认为这是正在发生的事情: 取消引用时,将在内存中创建其副本。该存储位置由以下位置返回 由于没有引用到刚刚创建的方法的副本,因此GC将其回收,并且该内存地址再次可用 取消引用时,将在相同的内存地址(可用)中创建它的副本,您可以再次使用该地址。 第二个副本是GCd 如果您要运行一堆其他代码并再次检查实例方法
问题内容: 我以为运算符检查对象的相等性。但事实并非如此: 问题答案: *Python *将相同的内存 位置用于方法和,这是*两个对象,它们的生命周期不重叠,因此对它们返回相同的标识。请参阅下面的详细说明。 从is运算符的文档中: 运算符是否测试对象标识:并且仅当x和y是同一对象时,x is y才是true。 从ID的文档中 返回对象的“身份”。这是一个整数(或长整数),在此对象的生存期内,此整数
问题内容: 根据我的理解,我认为: 两个对象具有相同的哈希码是完全合法的。 如果两个对象相等(使用equals()方法),则它们具有相同的哈希码。 如果两个对象不相等,则它们不能具有相同的哈希码 我对么? 现在,如果正确,我将遇到以下问题:内部使用对象的哈希码。因此,如果两个对象可以具有相同的哈希码,那么如何跟踪它使用的键? 有人可以解释内部如何使用对象的哈希码吗? 问题答案: 哈希图的工作方式如
我在android工作室工作,2.1.2。 我在两个活动之间有一个神秘角色转换异常。 在第一个活动中,我有这个ArrayList: 我将arraylist(parcellable)插入到bundle中,以便在另一个活动中发送: 在第二个活动中,我将此用于恢复ArrayList 现在按照 我什么都试过了,带和不带Bundle的发送,类输出结束输出都是一样的,为什么要这样铸造呢?那我该怎么解决?? 谢
问题内容: 似乎以下代码应返回true,但返回false。 这有什么意义? 问题答案: 常规()和严格()相等之间的唯一区别是,严格相等运算符禁用类型转换。由于已经在比较两个相同类型的变量,因此使用的相等运算符的类型无关紧要。 不管您使用常规相等还是严格相等,对象比较仅 在您比较相同的精确对象时得出 。 也就是说,给定,,,但。 两个不同的对象(即使它们都具有零或相同的精确属性)也永远不会相等地进
问题内容: 让我们创建两个列表: 出: 我创建了两个独立的列表,输出显示了两个不同的内存地址。这不足为奇。但是,现在让我们在没有分配的情况下做同样的事情: 出: 还有第二次: 出: 我不确定如何解释这一点。为什么这两个未命名列表具有相同的内存地址? 问题答案: 从文档: 返回对象的“身份”。这是一个整数,可以保证在此对象的生存期内唯一且恒定。 具有不重叠生存期的两个对象可能具有相同的id()值。