gpt4 book ai didi

python - 套接字对和 fork 中的 FD 重用

转载 作者:太空宇宙 更新时间:2023-11-03 18:14:36 26 4
gpt4 key购买 nike

我尝试编写一个 prefork 服务器进行研究,我发现 os.fork 会重用 FD 号。

虽然输出是正确的,但我伤人的是WHY

这是代码和输出

#!/usr/bin/env python
# encoding: utf-8

import os
import socket
import time

def main():


for x in xrange(4):
parent_sock, children_sock = socket.socketpair()
#parent_sock.setblocking(0)
#children_sock.setblocking(0)
pid = os.fork()

if pid != 0:
print os.getpid(), "M->parent", parent_sock.fileno()
print os.getpid(), "M->children", children_sock.fileno()
parent_sock.send('HI %d' % pid)

else:
#child
print os.getpid(), "C->parent", parent_sock.fileno()
print os.getpid(), "C->child", children_sock.fileno()
time.sleep(3)
print children_sock.fileno(), children_sock.recv(4096)
return


if __name__ == '__main__':
main()
正如你所看到的,它只是一个普通的预 fork 服务器代码,我使用 time.sleep 来禁用 python 销毁 child_sock。但为什么使用 fileno 4、6 的两个子进程仍然得到正确的答案?

$python fork.py
16414 M->parent 3
16414 M->children 4
16415 C->parent 3
16415 C->child 4
16414 M->parent 5
16414 M->children 6
16416 C->parent 5
16416 C->child 6
16414 M->parent 3
16414 M->children 4
16417 C->parent 3
16417 C->child 4
16414 M->parent 5
16414 M->children 6
16418 C->parent 5
16418 C->child 6

$4 HI 16415
6 HI 16416
4 HI 16417
6 HI 16418

最佳答案

垃圾收集。

在parent中的每次for迭代中,局部变量parent_sockchildren_sock指向新创建的套接字,并且以前的值不可访问不再,因此Python可能会选择关闭并重用旧的套接字。

如果你将所有套接字存储在某个地方,它会阻止Python进行垃圾收集,因此它不会关闭它们,你会看到不同的数字。

我的意思是:这段代码可以重用一些FD号码:

for x in xrange(4):
parent_sock, children_sock = socket.socketpair()
print "M->parent", parent_sock.fileno()
print "M->children", children_sock.fileno()

但是这段代码不能:

list_sockets = []
for x in xrange(4):
parent_sock, children_sock = socket.socketpair()
list_sockets.append([parent_sock, children_sock])
print "M->parent", parent_sock.fileno()
print "M->children", children_sock.fileno()

关于python - 套接字对和 fork 中的 FD 重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25199936/

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