5

プロセス間のファイル ハンドルを持つ共有リソースについて質問があります。ここに私のテストコードがあります:

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:

誰でもそれについて何か考えがありますか?ファイル ハンドル属性を持つオブジェクトを共有したい場合、どうすればよいですか?

4

1 に答える 1

7

ファイルハンドルを「実行中のプロセス間で渡す」ことはできないという@Markの繰り返しの主張に反対する必要があります(結局、コメントに収まりません;-)-これは、実際の現代では単に真実ではありませんたとえば、Unix などのオペレーティング システム (無料の BSD バリアント、MacOSX、および Linux が含まれています -- うーん、このリストから除外されている OS はどれでしょうか...?-) --もちろん、 sendmsgで実行できます。 (「Unix ソケット」では、SCM_RIGHTSフラグを使用して)。

現在、貧弱で貴重な人multiprocessingがこの機能を悪用しないのは完全に正しいです(Windowsにも実装するための黒魔術があるかもしれないと仮定しても)-ほとんどの開発者は間違いなくそれを誤用します(複数のプロセスが同じ開いているファイルに同時にアクセスし、実行している競合状態に)。これを使用する唯一の適切な方法は、特定のファイルを開く排他的な権限を持つプロセスが、開いているファイル ハンドルを、権限を減らして実行する別のプロセスに渡し、そのハンドル自体を二度と使用しないようにすることです。multiprocessingとにかく、モジュールでそれを強制する方法はありません。

@Andy の元の質問に戻ると、彼が Linux のみで (かつローカル プロセスのみで) 作業し、/proc ファイルシステムで汚いトリックを実行するつもりでない限り、彼はアプリケーション レベルのニーズをより明確に定義し、fileそれに応じてオブジェクトをシリアライズします。ほとんどのファイルにはパスがあり (またはパスを持つようにすることができます: パスのないファイルは非常にまれであり、実際には Windows には存在しないと思います)、それを介してシリアル化できます。他の多くのファイルは、内容オーバー…etc.

于 2009-07-03T02:55:17.400 に答える