如何将管理器对象传递给进程

How to pass a manager object to a process

我试图将整个管理器对象传递给进程,但我无法这样做。当我尝试时出现此错误:

Traceback (most recent call last):
  File "TwitchMarketDatabase.py", line 46, in <module>
    multiprocessing.Process(target=accept_thread, args=(SERVER, M)).start()
  File "C:\Program Files\Python36\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "C:\Program Files\Python36\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Program Files\Python36\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "C:\Program Files\Python36\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Program Files\Python36\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
  File "C:\Program Files\Python36\lib\multiprocessing\connection.py", line 939, in reduce_pipe_connection
    dh = reduction.DupHandle(conn.fileno(), access)
  File "C:\Program Files\Python36\lib\multiprocessing\connection.py", line 170, in fileno
    self._check_closed()
  File "C:\Program Files\Python36\lib\multiprocessing\connection.py", line 136, in _check_closed
    raise OSError("handle is closed")
OSError: handle is closed

C:\projects\twitch-market>pause
Press any key to continue . . . Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Program Files\Python36\lib\multiprocessing\spawn.py", line 99, in spawn_main
    new_handle = reduction.steal_handle(parent_pid, pipe_handle)
  File "C:\Program Files\Python36\lib\multiprocessing\reduction.py", line 82, in steal_handle
    _winapi.PROCESS_DUP_HANDLE, False, source_pid)
OSError: [WinError 87] The parameter is incorrect

我正在尝试创建一个连接到 python 程序的处理程序,该程序使用进程同时写入文件,除非正在写入一个文件。我想这是一种非常愚蠢的做法,但我看不到任何其他方式。所以我打算使用 M (管理器)对象为每个文件生成锁(如果它被写入)。然后我会将锁添加到字典中。这就是为什么我需要将 M 传递给接受连接线程。正如我所说,这是一种非常复杂和愚蠢的做法,我愿意接受关于我可以使用什么的建议。

if __name__ == '__main__':
    SERVER = socket.socket()
    SERVER.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    SERVER.bind(('127.0.0.1', 9988))
    M = multiprocessing.Manager()
    M.queues = M.dict()
    multiprocessing.Process(target=accept_thread, args=(SERVER, M)).start()
    print('Server Started.')
    input()

您不能将套接字对象作为参数传递给进程。您需要将代理引用传递给可变的内存中对象,以便在进程及其起源之间进行通信。

您可以通过多种方式解决此问题:

  1. 用管理器创建管道,传递对进程的引用。使用进程写入管道,并在创世纪中接收该数据。如果您需要将原始数据从进程传递到创世纪,这是最好的方法。

  2. 创建一个队列并将内容添加到队列中。在另一端接收。

  3. 创建一个类似文件的对象并将其放入管理器创建的名称空间中。将命名空间引用作为参数传递给进程。

如果您需要将该数据传递给另一个进程,您仍然可以通过您创建的套接字传递它。但是,对于这种情况,如果您实际上在 内部 进程中创建一个套接字对象并直接与您想要的打开的套接字通信会更好。

如果您的进程跨网络,则有更复杂的方法,例如建立一个跨网络管理器,其工作方式类似于带套接字的休息服务器,并在顶部构建进程。但是,如果您只需要在同一文件 运行 的进程和创世进程之间进行通信,则这是不必要的。