不同进程,相同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.
我正在尝试使用多处理模块生成几个进程。 但是,当我调用 os.getpid() 每个进程 returns 与主调用进程相同的 PID。
为什么? 我在 Ubuntu 14.04.
上使用 Python 2.7class 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.