Я написал этот небольшой пример:
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
fork
? - person Reut Sharabani   schedule 17.12.2014fork
, для создания дочерних процессов. До этого все, что вы можете сделать, это попытаться сохранить fd вне глобального состояния или явно закрыть открытые fd в дочернем процессе после того, как произошло дублирование. - person dano   schedule 17.12.2014Queues
. Я бы, вероятно, предпочел открывать файл в каждом дочернем элементе только в том случае, если вы отправляете огромные объемы данных через очереди, поскольку стоимость IPC будет очень высокой. - person dano   schedule 17.12.2014