是否可以使用Python在pool.map()中对self使用“静态”引用?

时间:2018-07-19 20:30:59

标签: python python-multiprocessing

我有一行这样的代码:

pool.map(functools.partial(method_to_run, self), data)

method_to_run接收数据项,然后使用附加到self的对象使用包含早先设置的包含身份验证令牌的该对象的实例变量来向服务器发出请求。

我遇到的问题是,每个进程似乎都获得了该对象的新实例(或self),因此该实例没有设置令牌,因此请求失败。

是否有一种在共享进程之间共享自我的方法?

2 个答案:

答案 0 :(得分:1)

虽然您可以使用管理器来执行此操作,但这意味着该对象每次被修改时都会复制到所有其他进程中。

我建议将令牌本身传递给进程,而不是复制整个对象。如果调用pool.map时没有可用的令牌,那么惯用的想法是创建一个Queue以便稍后将令牌发送到您的进程。您的进程可以位于Queue的另一端,并在发出请求之前等待令牌。

答案 1 :(得分:1)

TLDR:您的描述方式-否-不可能。

每当您分叉一个进程(即通过创建一个进程池)时,内存中的所有数据都将被复制到一个分叉中(即未引用)。

结果,您对原始有效负载进行的任何更改都不会影响派生的副本。

您在这里有三个选择:

  1. 使用线程池(线程共享内存):https://docs.python.org/3/library/threading.html
  2. 采用IPC结构:https://pymotw.com/2/multiprocessing/communication.html
  3. 在创建进程池之前,将身份验证令牌分配给self。这样可以确保自己的副本包含令牌。