gpt4 book ai didi

python-2.7 - 不同进程,相同PID | Python

转载 作者:行者123 更新时间:2023-12-04 18:03:07 25 4
gpt4 key购买 nike

我正在尝试使用多处理模块生成几个进程。但是,当我调用 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()

最佳答案

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

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

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

pid

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

关于python-2.7 - 不同进程,相同PID | Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31712766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com