不同进程,相同PID | Python

Different processes, same PID | Python

我正在尝试使用多处理模块生成几个进程。 但是,当我调用 os.getpid() 每个进程 returns 与主调用进程相同的 PID。

为什么? 我在 Ubuntu 14.04.

上使用 Python 2.7
class Listener(multiprocessing.Process):
    def __init__(self, _ttl):
        super(Listener, self).__init__()
        self.ttl = _ttl
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.bind(('localhost', 0))

    def get_pid(self):
        return os.getpid()  

    def get_name(self):
        return self.socket.getsockname()

    def run(self):
        self.socket.listen(1)
        time.sleep(self.ttl)

    def listen(self):
        self.start()

class TestEx1(unittest.TestCase):
    def test_address_to_pid(self):
        listener1 = Listener(12)
        listener2 = Listener(12)
        listener3 = Listener(12)
        listener1.listen()
        listener2.listen()
        listener3.listen()
        address1 = str(str(listener1.get_name()[0])) + ":" + str(listener1.get_name()[1])
        address2 = str(str(listener2.get_name()[0])) + ":" + str(listener2.get_name()[1])
        address3 = str(str(listener3.get_name()[0])) + ":" + str(listener3.get_name()[1])

        print listener1.get_pid()
        print ex1.address_to_pid(address1)

        print listener2.get_pid()
        print ex1.address_to_pid(address2)

        print listener3.get_pid()
        print ex1.address_to_pid(address3)


        assert(str(ex1.address_to_pid(address1)) == str(listener1.get_pid()))
        assert(str(ex1.address_to_pid(address2)) == str(listener2.get_pid()))
        assert(str(ex1.address_to_pid(address3)) == str(listener3.get_pid()))

        listener2.join()
        listener2.join()
        listener3.join()

因为os.getpid()是从运行测试的原始进程调用的。

Listener 个实例是 Python 个可在原始进程中访问的对象。因为这些对象是 multipricessing.Process 的实例,所以它们可以帮助原始进程产生新进程。 然而,在原始测试过程中,TestEx1 class 正在通过这些对象调用 os.getpid()(在原始过程中)。这就是为什么他们 return 相同的 pid。

为了获取Listener进程的pid,在进程启动后调用listener1.pid属性。 Documentation 说明

pid

Return the process ID. Before the process is spawned, this will be None.