是否可以使用 Python 在 pool.map() 中使用对自身的 "static" 引用?

Is it possible to use a "static" reference to self in pool.map() using Python?

我有这样一行代码:

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

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

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

有没有办法在池化进程之间共享自我?

虽然您可以使用管理器来完成,但这意味着每次修改对象时都会将其复制到所有其他进程。

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

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

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

因此,您对原始负载所做的任何更改都不会影响分叉的副本。

这里有三个选项:

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