Tôi có câu hỏi về tài nguyên được chia sẻ có xử lý tệp giữa các quy trình. Đây là mã thử nghiệm của tôi:Chia sẻ các đối tượng có thuộc tính xử lý tệp giữa các quá trình
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()
Sau đó, tôi nhận được một KeyError
như dưới đây:
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'
Tôi nghĩ khi tôi đặt các đối tượng File()
vào hàng đợi, các đối tượng đã tuần tự hóa và xử lý tập tin không thể được tuần tự hóa, vì vậy, tôi đã nhận được KeyError
:
Bất kỳ ai cũng có ý tưởng về điều đó? nếu tôi muốn chia sẻ các đối tượng với thuộc tính xử lý tệp, tôi nên làm gì?
Tôi nghĩ điều tôi muốn nói (làm cho điều này ít nhất là lần sửa thứ hai) là tệp * bộ mô tả * - nơi bạn thường nhận được một số> = 3 (do 0,1, 2 được dành riêng cho std {in, out, err}). Vì vậy, nếu bạn mở một tập tin và nó mô tả là 3, đi qua 3 đến một quá trình khác là vô nghĩa. Cuối cùng tôi đã đánh nó ở đó phải không? –
cảm ơn rất nhiều, Alex! Vì vậy, như bạn đã nói, nó là rất khó khăn nếu tôi muốn vượt qua xử lý tập tin giữa các quá trình trên cửa sổ. Nếu tôi muốn vượt qua các tập tin, tôi nên vượt qua đường dẫn tập tin hoặc nội dung của tập tin, không phải tập tin xử lý. – Ryan
@Mark, không thực sự, nó thực sự là '3' bạn cần phải vượt qua ... chỉ trên một ổ cắm AF_UNIX và với cờ SCM_RIGHTS (hạt nhân sẽ làm phần còn lại của ma thuật cần thiết: số lượng có thể đến! = 3 nhưng nó sẽ là một bộ mô tả cho cùng một tệp mở). Solaris có một cách sạch hơn, nếu tôi nhớ chính xác, và thực sự một số syscalls để đối phó đúng với vấn đề (nhưng nó đã quá lâu kể từ khi tôi thực sự làm việc trên Solaris, thở dài, tôi không nhớ lại). –