Совместное использование объектов с атрибутом дескриптора файла между процессами

У меня есть вопрос об общем ресурсе с дескриптором файла между процессами. Вот мой тестовый код:

from multiprocessing import Process,Lock,freeze_support,Queue
import tempfile
#from cStringIO import StringIO

class File():
    def __init__(self):
        self.temp = tempfile.TemporaryFile()
        #print self.temp

    def read(self):
        print "reading!!!"
        s = "huanghao is a good boy !!"
        print >> self.temp,s
        self.temp.seek(0,0)

        f_content = self.temp.read()
        print f_content

class MyProcess(Process):
    def __init__(self,queue,*args,**kwargs):
        Process.__init__(self,*args,**kwargs)
        self.queue = queue

    def run(self):
        print "ready to get the file object"
        self.queue.get().read()
        print "file object got"
        file.read()

if __name__ == "__main__":
    freeze_support()
    queue = Queue()
    file = File()

    queue.put(file)
    print "file just put"

    p = MyProcess(queue)
    p.start()

Тогда я получаюKeyError как ниже:

file just put
ready to get the file object
Process MyProcess-1:
Traceback (most recent call last):
  File "D:\Python26\lib\multiprocessing\process.py", line 231, in _bootstrap
    self.run()
  File "E:\tmp\mpt.py", line 35, in run
    self.queue.get().read()
  File "D:\Python26\lib\multiprocessing\queues.py", line 91, in get
    res = self._recv()
  File "D:\Python26\lib\tempfile.py", line 375, in __getattr__
    file = self.__dict__['file']
KeyError: 'file'

Я думаю, когда я ставлюFile() объект в очередь, объект сериализован, и дескриптор файла не может быть сериализован, поэтому я получилKeyError:

У кого-нибудь есть идеи по этому поводу? что мне делать, если я хочу поделиться объектами с атрибутом дескриптора файла?

Ответы на вопрос(1)

Решение Вопроса

он просто не помещается в комментариях ;-) к повторному утверждению @ Mark о том, что дескрипторы файлов просто не могут быть "переданы между запущенными процессами" - это просто не соответствует действительности в современных современных операционных системах, таких как, скажем, Unix (включая бесплатные варианты BSD, MacOSX и Linux) - хммм, интересно, какие ОС оставлены в этом списке. ..? -) -sendmsg конечно, можно сделать это (на «сокете Unix», используяSCM_RIGHTS флаг).

Теперь бедные, ценныеmultiprocessing совершенно верно не использовать эту функцию (даже если предположить, что может быть реализована и черная магия для ее реализации в Windows) - большинство разработчиков, несомненно, все равно будут ее использовать неправильно (если несколько процессов одновременно обращаются к одному и тому же открытому файлу и работают в условиях гонки) Единственный правильный способ его использования - для процесса, обладающего исключительными правами на открытие определенных файлов, для передачи открытых файловых дескрипторов другому процессу, который работает с ограниченными привилегиями, и затем никогда больше не использует этот дескриптор. Нет способа обеспечить это вmultiprocessing модуль, во всяком случае.

Возвращаясь к исходному вопросу @ Andy, если он не собирается работать только в Linux (и только с локальными процессами) и не хочет играть грязные трюки с файловой системой / proc, ему придется определить свое приложение. Уровень нужно острее и сериализироватьfile объекты соответственно. У большинства файлов есть путь (или его можно сделать так: файлы без пути встречаются довольно редко, я думаю, что в действительности их нет в Windows), и поэтому их можно сериализовать через него - многие другие достаточно малы для сериализации, отправляя свои содержание более - и т. д. и т. д.

 Ryan03 июл. 2009 г., 05:20
Большое спасибо, Алекс! Итак, как вы сказали, очень трудно, если я хочу передать файловые дескрипторы между процессами в Windows. Если я хочу передать файлы, я должен передать путь к файлу или его содержимое, а не дескрипторы файлов.
 03 июл. 2009 г., 05:25
@ Марк, не совсем, это действительно3 вам нужно передать ... только на сокет AF_UNIX и с флагом SCM_RIGHTS (ядро сделает остальную необходимую магию: число, которое приходит, вероятно, будет! = 3, но это будет дескриптор того же открытого файла ). У Solaris, если я правильно помню, есть более чистый способ и несколько системных вызовов для правильного решения этой проблемы (но прошло слишком много времени с тех пор, как я действительно работал над Solaris, вздох, я не помню точно).
 03 июл. 2009 г., 05:18
Я думаю, что то, что я хотел сказать (делая это, по крайней мере, второе исправление), было файломdescriptor - где вы обычно получаете число & gt; = 3 (из-за того, что 0,1,2 зарезервировано для std {in, out, err}). Таким образом, если вы открываете файл и его дескриптор равен 3, передача 3 другому процессу не имеет смысла. Я, наконец, ударил его там?
 03 июл. 2009 г., 05:27
@ Andy, да, вы прекрасно суммируете суть - пути к файлам просты, содержимое файлов просты, ручки для открытия файлов слишком сложны (и я слишком заржавел как гуру Win32, чтобы даже ПОПРОБОВАТЬ, чтобы & quot ' ; зови этих духов из глубин ";-).

Ваш ответ на вопрос