Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 文件句柄为父进程打开,但为每个子进程关闭_Python_Linux_Multiprocessing_Python Multiprocessing - Fatal编程技术网

Python 文件句柄为父进程打开,但为每个子进程关闭

Python 文件句柄为父进程打开,但为每个子进程关闭,python,linux,multiprocessing,python-multiprocessing,Python,Linux,Multiprocessing,Python Multiprocessing,我写了一个小例子: import multiprocessing from functools import partial def foo(x, fp): print str(x) + " "+ str(fp.closed) return def main(): with open("test.txt", 'r') as file: pool = multiprocessing.Pool(multiprocessing.cpu_count())

我写了一个小例子:

import multiprocessing
from functools import partial

def foo(x, fp):
    print str(x) + " "+ str(fp.closed)
    return

def main():
    with open("test.txt", 'r') as file:
        pool = multiprocessing.Pool(multiprocessing.cpu_count())
        partial_foo = partial(foo, fp=file)
        print file.closed
        pool.map(partial_foo, [1,2,3,4])
        pool.close()
        pool.join()
        print file.closed
        print "done"

if __name__=='__main__':
    main()
将打印:

False
2 True
3 True 
1 True
4 True
False
done
我的问题是,为什么子进程的文件句柄是关闭的,我如何使它们保持打开状态,以便每个进程都可以处理该文件

由于评论中提出了这一问题:

$ uname -a && python2.7 -V
Linux X220 3.17.6-1-ARCH #1 SMP PREEMPT Sun Dec 7 23:43:32 UTC 2014 x86_64 GNU/Linux
Python 2.7.9

这与将文件作为参数传递有关。已将fp更改为文件

import multiprocessing
from functools import partial

def foo(x, fp):
    print str(x) + " "+ str(file.closed)
    return

if __name__=='__main__':
    with open("test.txt", 'r') as file:
        pool = multiprocessing.Pool(multiprocessing.cpu_count())
        partial_foo = partial(foo, fp=file)
        print file.closed
        pool.map(partial_foo, [1,2,3,4])
        pool.close()
        pool.join()
        print file.closed
        print "done"
输出

False
1 False
2 False
3 False
4 False
False
done

你在用什么操作系统?什么版本的Python?@dano,Linux。Arch Linux正在运行Python 2.7。相关问题:。一般来说,您可能不想这样做,尽管有一些特定于平台的方法可以做到这一点。你到底想让每个孩子用fd做什么?@dano,我试着简单解释一下。给定给pool.map函数的iterable列表是我希望函数分析的许多块/簇。因此,我认为这种方法比在每个进程运行时打开和关闭文件要好。@ap0它可以工作,但可能执行得不太好,因为所有进程将同时尝试从磁盘读取数据。您的HDD一次只能从一个位置读取数据,因此它最终会在磁盘的不同位置之间来回跳转,以读取每个进程的数据。这可能会比只按顺序读取文件一次,然后通过
队列将数据发送给孩子们要慢。如果您通过队列发送大量数据,我可能只会倾向于在每个孩子中打开文件,因为IPC的成本非常高。什么?为什么会这样?我是否应该得到一个错误,说明函数
foo
中的
file
未知?但是你是对的,它是有效的。但是在哪里呢?至少我没有创建全局文件对象。还是我?很抱歉,如果这个问题很愚蠢的话。这是因为在Linux上,
fork
用于在
池中生成子进程,所以
文件
中定义的对象在
中,如果uuuu name\uuuuu==“uuu main\uuuuu”
块在每个子进程中都被继承。如果在创建
实例后打开文件,此代码将中断。此答案毫无意义。据我所知,你可以删除fp。。。您所做的只是从
main
的作用域中获取
文件
。因此,换一种方式说,您实际上并没有在
池中发送open fd-between进程。map
调用。当在
多处理.Pool(…)
调用中调用
fork
时,打开的fd由每个子级从全局状态继承,这意味着您可以在工作进程中访问它。