当前位置: 首页 > 面试题库 >

在进程之间共享具有文件句柄属性的对象

乜胜泫
2023-03-14
问题内容

我对进程之间具有文件句柄的共享资源有疑问。这是我的测试代码:

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

有人对此有任何想法吗?如果要共享具有文件句柄属性的对象,该怎么办?


问题答案:

我不得不反对(总之,不仅仅会放在注释中;-)
@Mark反复断言文件句柄不能“在运行的进程之间传递”-这在现实,现代中根本不是真的操作系统,例如Unix(包括免费的BSD变体,MacOSX和Linux,包括hmmm,我想知道这个列表中没有什么OS
…?-)- sendmsg当然可以做到这一点(在“
Unix套接字”上,通过使用SCM_RIGHTS标志)。


现在,穷人,有价值multiprocessing的人完全可以不使用此功能(即使假设也可能在Windows上实现此功能)–大多数开发人员无疑会滥用它(让多个进程同时访问同一打开文件并运行)进入比赛条件)。唯一正确的使用方法是,对于一个拥有专有权的进程,该进程有权打开某些文件,以将打开的文件句柄传递给另一个以降低的特权运行的进程,然后再也不使用该句柄。无论如何,无法在multiprocessing模块中强制执行该操作。

回到@Andy最初的问题,除非他只打算在Linux上工作(也只与本地进程一起工作),并且愿意在/
proc文件系统上耍花招,否则他将不得不更加明确地定义他的应用程序级别需求,并且相应地序列化file对象。大多数文件都有一个路径(或者可以做成一个路径:无路径文件非常少见,我相信Windows上实际上不存在),因此可以通过它进行序列化-
许多其他文件足够小,可以通过发送它们来进行序列化内容超过-等



 类似资料:
  • 我在堆栈中发现了类似的问题,但我不确定它们是否适用于PHP。 我想用pcntl_fork()创建子进程。我想将来自父进程和子进程的消息写入日志文件。 如果我在父级中打开一个文件句柄,从子级写入同一个句柄是否安全?请注意,我将只附加到文件中。 我担心可能发生的争用情况,特别是如果两个进程在不同的内核上执行:如果两个进程在两个不同的内核上同时写入同一个文件句柄,会发生什么情况?

  • 问题内容: 我正在尝试使用部分函数,​​以便pool.map()可以定位具有多个参数(在本例中为Lock()对象)的函数。 这是示例代码(摘自我之前的问题的答案): 但是,当我运行此代码时,出现错误: 我在这里想念什么?如何在子流程之间共享锁? 问题答案: 您不能将普通对象传递给方法,因为它们不能被腌制。有两种方法可以解决此问题。一种是创建并传递一个: 不过,这有点重量级;使用需要产生另一个进程来

  • 在域模式下,我可以使用属性文件作为模块,但问题是如果文件中有任何修改,那么我需要对域中的所有从属设备进行修改。我想集中文件,以便在某一点上我可以更改,它将反映在所有从属设备上。 我知道领域。xml,我们可以配置全局级别的系统属性,但我有大约25个属性文件。 那么有没有办法集中文件呢?? myjar.jar是一个存档的jar文件来获取xml文件 这不管用。 试过这个 如何列出JAR文件中的文件? 并

  • 问题内容: 通过回答此问题,可以回答所有其他三个问题。希望我能说清楚: 在通过多处理创建的某些过程中创建对象后: 如何将对该对象的 引用 传递给其他进程? (不是很重要)我如何确保持有参考书时此过程不会消失? 示例1(已解决) 例子2 假设返回一个具有可变状态的对象。这个相同的对象应该可以从其他进程访问。 例子3 我有一个带有打开文件和锁的对象-如何授予对其他进程的访问权限? 提醒 我不希望此特定

  • 问题内容: 我有以下问题。我编写了一个函数,该函数将列表作为输入并为列表中的每个元素创建一个字典。然后,我想将此字典追加到新列表中,以便获得字典列表。我正在尝试为此生成多个进程。我在这里的问题是,我希望不同的进程访问字典列表,因为它由其他进程更新,例如,一旦达到一定长度,就打印一些东西。 我的例子是这样的: 现在我的问题是每个过程都创建自己的过程。有没有一种方法可以在进程之间共享列表,以便所有字典

  • 我有一个节点类,它包含两个嵌套类,服务器和客户机,以及指向每个类实例的指针。 我的猜测是上下文切换正在发生,因此每个进程都有自己的副本被加载到相同的地址中。 我如何改变这一点,使每个进程访问该节点的完全相同的副本? 更新: