叉:closures所有打开的套接字

我正在使用multiprocessing.Pool.map ,它分叉当前进程。

我的理解是,默认情况下, 包括套接字的所有文件描述符都是在分叉时从主进程复制的。 主进程本身是一个Web服务器(使用cherrypy ),所以这对开放端口等造成严重破坏。分叉进程实际上只是在服务器正在使用的一个库中执行一些CPU数量较大的数字内容 – 没有任何事情可做与networking/套接字部分。

是否有一种简单的方法来自动closures新进程中的所有套接字? 或者另一种方法来避免分叉CherryPy服务器的问题?

使用CherryPy 3.2.2,Python 2.7; 必须在Linux和OS X上工作。

POSIX不包括一个明智的方式来列出或关闭一系列文件描述符。

所以我们必须遍历整个范围(比如从3到1023),一次关闭一个文件描述符。

或者,如果我们有一个/ proc文件系统,我们可以读取/ proc / self / fd中打开的文件描述符列表并关闭这些文件描述符。 这可能比关闭所有可能的文件描述符更快。

 import os def close_files(fd_min=3, fd_max=-1): if os.path.exists('/proc/self/fd'): close_files_with_procfs(fd_min, fd_max) else: close_files_exhaustively(fd_min, fd_max) def close_files_exhaustively(fd_min=3, fd_max=-1): import resource fd_top = resource.getrlimit(resource.RLIMIT_NOFILE)[1] - 1 if fd_max == -1 or fd_max > fd_top: fd_max = fd_top for fd in range(fd_min, fd_max+1): try: os.close(fd) except OSError: pass def close_files_with_procfs(fd_min=3, fd_max=-1): for nm in os.listdir("/proc/self/fd"): if nm.startswith('.'): continue fd = int(nm) if fd >= fd_min and (fd_max == -1 or fd < fd_max): try: os.close(fd) except OSError: pass def timereps(reps, func): from time import time start = time() for i in range(0, reps): func() end = time() return (end - start) / reps print "close_files: %f" % timereps(100, lambda: close_files()) print "close_files_exhaustively: %f" % timereps(100, lambda: close_files_exhaustively()) print "close_files_with_procfs: %f" % timereps(1000, lambda: close_files_with_procfs()) 

在我的系统上:

 $ python ./close_fds.py close_files: 0.000094 close_files_exhaustively: 0.010151 close_files_with_procfs: 0.000039