Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python通用多进程(无子进程)_Python_Multiprocessing - Fatal编程技术网

Python通用多进程(无子进程)

Python通用多进程(无子进程),python,multiprocessing,Python,Multiprocessing,我要么很难理解多进程库的逻辑,要么我遗漏了一些东西 以下两种说法正确吗 除了SharedMemoryManager之外,多进程库不提供任何在进程之间共享数据的方法,除非所述进程是原始进程通过库本身生成的子进程 多进程管理器生成一个管理共享对象的服务器进程(即,它不使用共享内存) 第一点是基于我所看到的构造函数的签名的推断,但我不确定我是否正确,因为这意味着在最常见的多处理情况下(即,当进程不是主进程的子进程时),大多数库都是无用的 如果我是正确的,多进程基本上是一个奇怪的线程库,由于GIL的

我要么很难理解多进程库的逻辑,要么我遗漏了一些东西

以下两种说法正确吗

  • 除了SharedMemoryManager之外,多进程库不提供任何在进程之间共享数据的方法,除非所述进程是原始进程通过库本身生成的子进程

  • 多进程管理器生成一个管理共享对象的服务器进程(即,它不使用共享内存)

  • 第一点是基于我所看到的构造函数的签名的推断,但我不确定我是否正确,因为这意味着在最常见的多处理情况下(即,当进程不是主进程的子进程时),大多数库都是无用的

    如果我是正确的,多进程基本上是一个奇怪的线程库,由于GIL的问题,它使用进程而不是线程

    第二点来自官方文档,但与共享内存方法相比,它的效率非常低,所以我怀疑我误解了

    如果我是对的,那么我还有最后一个问题:

  • 是否有更高级、更基本的SharedMemoryManager版本(即使在不同的库中)?类似于boost::interprocess的东西。可以在shmem中分配并为我管理的东西,如示例中的CrossProcessDict:

  • 您会说,“在最常见的多进程情况下(即,当进程不是主进程的子进程时),大多数库都是无用的。”正是在这种情况下,应该保护进程不受其他进程的窥视。它们仍然有通信机制(sockets、
    SyncManager
    等),但通信方式更加安全、可控。在我的共享服务器上,我的ISP一起阻止了共享内存服务。我猜ISP担心的是,如果你能猜到共享内存密钥,你就可以查看其他用户的内存。在很多情况下,你没有选择,而在其他情况下,你仍然会选择一个命名的共享内存部分,我想这就是库提供SharedMemoryManager对象的原因。问题是,从我从文档中了解到的情况来看,这对于我的用例来说太简单了。
    # Imagine I make this hashable by defining __eq__ and __hash__
    @dataclass
    class Key:
      field1: str
      field2: str
    
    # Only some member functions will be "public".
    # Those will be the ones taking care of the locking.
    @dataclass
    class Value:
      _array: List[float]
      _num1: int
      _num2: int
      _multiprocess_lock: Lock
    
    @dataclass
    class CrossProcessDict:
      my_dict1: Dict[Key, Value]
      my_dict2: Dict[Key, Value]