我对进程之间具有文件句柄的共享资源有疑问。这是我的测试代码:
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如下图所示:
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:
File()
有人对此有任何想法吗?如果要共享具有文件句柄属性的对象,该怎么办?
我不得不反对(总之,不仅仅会放在注释中;-) @Mark反复断言文件句柄不能“在运行的进程之间传递”-这在现实,现代中根本不是真的操作系统,例如Unix(包括免费的BSD变体,MacOSX和Linux,包括hmmm,我想知道这个列表中没有什么OS …?-)- sendmsg当然可以做到这一点(在“ Unix套接字”上,通过使用SCM_RIGHTS标志)。
SCM_RIGHTS
现在,穷人,有价值multiprocessing的人完全可以不使用此功能(即使假设也可能在Windows上实现此功能)–大多数开发人员无疑会滥用它(让多个进程同时访问同一打开文件并运行)进入比赛条件)。唯一正确的使用方法是,对于一个拥有专有权的进程,该进程有权打开某些文件,以将打开的文件句柄传递给另一个以降低的特权运行的进程,然后再也不使用该句柄。无论如何,无法在multiprocessing模块中强制执行该操作。
multiprocessing
回到@Andy最初的问题,除非他只打算在Linux上工作(也只与本地进程一起工作),并且愿意在/ proc文件系统上耍花招,否则他将不得不更加明确地定义他的应用程序级别需求,并且相应地序列化file对象。大多数文件都有一个路径(或者可以做成一个路径:无路径文件非常少见,我相信Windows上实际上不存在),因此可以通过它进行序列化- 许多其他文件足够小,可以通过发送它们来进行序列化内容超过-等
file