不同的过程,相同的PID |蟒蛇

时间:2015-07-29 23:19:11

标签: python-2.7 python-multiprocessing

我正在尝试使用多处理模块生成一些进程。 但是当我调用os.getpid()时,每个进程都返回与主调用进程相同的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()

1 个答案:

答案 0 :(得分:1)

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

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

为了获得监听器进程的pid,请在进程启动后调用listener1.pid属性。 Documentation解释

  

PID

     

返回进程ID。在生成该过程之前,这将是None。