Ich habe eine Frage über freigegebene Ressource mit Dateizugriff zwischen Prozessen. Hier ist mein Testcode:Freigabe von Objekten mit Datei-Handle-Attribut zwischen Prozessen
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()
Dann bekomme ich ein KeyError
wie unten:
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'
Ich denke, wenn ich die File()
in Warteschlange Objekt setzen, das Objekt bekam serialisiert und Datei-Handle kann nicht serialisiert werden, also, ich habe die KeyError
:
Wer hat eine Idee dazu? Wenn ich Objekte mit dem Dateizugriffsattribut teilen möchte, was soll ich tun?
Ich denke, was ich sagen wollte (dies zumindest die zweite Korrektur) war Datei * descriptor * - wo Sie in der Regel eine Zahl> = 3 erhalten (wegen 0,1, 2 ist reserviert für std {in, out, err}). Wenn Sie also eine Datei öffnen und der Deskriptor 3 lautet, ist die Weitergabe von 3 an einen anderen Prozess bedeutungslos. Habe ich es endlich geschafft? –
vielen dank, Alex! Also, wie Sie gesagt haben, ist es sehr schwer, wenn ich Dateigriffe zwischen Prozessen auf Windows übergeben möchte. Wenn ich Dateien weitergeben möchte, sollte ich den Dateipfad oder den Inhalt der Datei übergeben, nicht Dateigriffe. – Ryan
@Mark, nicht wirklich, es ist in der Tat die '3' müssen Sie übergeben ... nur an einem AF_UNIX-Socket und mit dem SCM_RIGHTS-Flag (der Kernel wird den Rest der benötigten Magie tun: die Nummer, die ankommt, kann wahrscheinlich sein! = 3, aber es wird ein Deskriptor für die gleiche offene Datei sein). Solaris hat einen saubereren Weg, wenn ich mich recht erinnere, und tatsächlich mehrere syscalls, um richtig mit dem Problem umzugehen (aber es ist zu lange her, dass ich tatsächlich an Solaris gearbeitet habe, Seufz, ich erinnere mich nicht scharf). –