我有关于与进程之间的文件句柄的共享资源的问题。 这是我的测试代码:

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

任何人有任何想法?如果我想与大家分享的文件句柄属性的对象,我该怎么办?

有帮助吗?

解决方案

我反对(在长度,将不只是适合在commentl ;-)改为@马克的反复断言的文件句柄只是不能为“正在运行的进程之间传来传去” - 这是不正确的真正的,现代的操作系统,比如,哦,比方说,UNIX(免费的BSD变体的MacOSX和Linux,包括 - 嗯,我不知道是什么留下操作系统的这份名单的... - ?) - 的 SENDMSG 当然可以做到这一点(在“Unix套接字”,通过使用SCM_RIGHTS标志)。

现在穷的,有价值的multiprocessing是完全正确的未利用此功能(即使假设有可能是黑魔法来实现它在Windows太) - 大多数开发人员无疑会误用也无妨(有多个进程访问相同的开放文件同时运行到比赛条件)。使用的唯一正确的方法是对于具有专有权打开某些文件,通过打开的文件句柄与减少的权限运行的另一个进程 - 然后,切勿使用再处理本身。没有办法执行该multiprocessing模块中,无论如何。

返回@安迪的最初的问题,除非他要在Linux上只工作(并与当地只处理,太),并愿与/ proc文件系统玩肮脏的把戏,他将要定义自己的应用层次需求更加尖锐并相应序列file对象。大多数文件都有一个路径(或可制成具有一个:路径减档都相当罕见,在Windows上,我相信实际上不存在的),因此可以通过它连载 - 许多人都足够小,通过向他们的序列化含量超过 - 等,等

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top