我正在尝试使用多处理模块生成一些进程。 但是当我调用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()
答案 0 :(得分:1)
这是因为os.getpid()
是从运行测试的原始进程调用的。
Listener
个实例是原始进程中可访问的Python对象。因为这些对象是multipricessing.Process
的实例,所以它们可以帮助原始进程生成新进程。
但是,在原始测试过程中,TestEx1类通过这些对象调用os.getpid()
(在原始过程中)。这就是为什么他们返回相同的pid。
为了获得监听器进程的pid,请在进程启动后调用listener1.pid
属性。 Documentation解释
PID
返回进程ID。在生成该过程之前,这将是None。