为什么 Python 的 _multiprocessing.SemLock 没有 'name'?

Why doesn't Python's _multiprocessing.SemLock have 'name'?

我的环境

了解我的问题的更多背景信息

据我了解,Modules/_multiprocessing/semaphore.c实现了内部Python对象SemLock,用于实现 multiprocessing.synchronize.SemLock中的Python 标准库:

class SemLock(object):
    def __init__(self, kind, value, maxvalue, *, ctx):
        (...A lot of other code...)
                sl = self._semlock = _multiprocessing.SemLock(  # <-- Here.

Modules/_multiprocessing/semaphore.c 通过在 C 中定义 SemLockObject 并将其导出为 来实现此内部 SemLock 对象Python.

中的 SemLock

这是 C 定义:

typedef struct {
    PyObject_HEAD
    SEM_HANDLE handle;
    unsigned long last_tid;
    int count;
    int maxvalue;
    int kind;
    char *name;  /* <--- It has 'name'. */
} SemLockObject;

稍后 SemLockObject 导出为 SemLock,在 Line #617:

PyTypeObject _PyMp_SemLockType = {
    PyVarObject_HEAD_INIT(NULL, 0)
    /* tp_name           */ "_multiprocessing.SemLock",
    /* tp_basicsize      */ sizeof(SemLockObject),

连同 SemLock,也导出了几个 _semlock_members_,包括 'name'。见 Line #608:

static PyMemberDef semlock_members[] = {
    {"handle", T_SEM_HANDLE, offsetof(SemLockObject, handle), READONLY,
     ""},
    {"kind", T_INT, offsetof(SemLockObject, kind), READONLY,
     ""},
    {"maxvalue", T_INT, offsetof(SemLockObject, maxvalue), READONLY,
     ""},
    {"name", T_STRING, offsetof(SemLockObject, name), READONLY,
     ""},  /* <--- Here it is. */
    {NULL}
};

因此,有理由相信我可以在运行时间访问name成员。但是,当我检查此内部 SemLock 对象的成员时,我没有看到 name 成员。这是我的检查代码:

import multiprocessing as mp
import inspect

lock = mp.Semaphore(1)
members = inspect.getmembers(lock._semlock)
for (name, _) in members:
    print name

结果如下:

SEM_VALUE_MAX
__class__
__delattr__
__doc__
__enter__
__exit__
__format__
__getattribute__
__hash__
__init__
__new__
__reduce__
__reduce_ex__
__repr__
__setattr__
__sizeof__
__str__
__subclasshook__
_after_fork
_count
_get_value
_is_mine
_is_zero
_rebuild 
acquire 
handle      <-- 'handle' is defined in 'semlock_members'
kind        <-- 'kind' is defined in 'semlock_members'
maxvalue    <-- 'maxvalue' is defined in 'semlock_members'
release

但是name在哪里??

实际上,如果我们查看 multiprocessing.synchronize.SemLock.__init__ Line #76,它测试 _semlock.name 的值:

if self._semlock.name is not None:

这让我觉得底层 _semlock 有 'name' 成员,否则代码会引发像 "AttributeError: '_multiprocessing.SemLock' object has no attribute 'name'".

这样的异常

我一定漏掉了什么地方。有人能帮我指出吗??

您正在使用 Python 2.7,但正在查看 Python 3.7 源代码。参见 2.7's semlock_members