是否可以使用 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:您描述的方式 - 不 - 这是不可能的。
每当你分叉一个进程(即通过创建这些进程的池)时,内存中的所有数据都会被复制到一个分叉中(即不被引用)。
因此,您对原始负载所做的任何更改都不会影响分叉的副本。
这里有三个选项:
- 使用线程池(线程共享内存):https://docs.python.org/3/library/threading.html
- 使用 IPC 结构:https://pymotw.com/2/multiprocessing/communication.html
- 在创建进程池之前将身份验证令牌分配给自己。这将确保自己的副本将包含令牌。
我有这样一行代码:
pool.map(functools.partial(method_to_run, self), data)
method_to_run
获取数据项,然后使用附加到自身的对象向服务器发出请求,使用该对象的实例变量包含先前设置的身份验证令牌。
我遇到的问题是每个进程似乎都获得了该对象的一个新实例(或 self
),因此该实例没有设置令牌,因此请求失败。
有没有办法在池化进程之间共享自我?
虽然您可以使用管理器来完成,但这意味着每次修改对象时都会将其复制到所有其他进程。
我建议将令牌本身传递给进程,而不是复制整个对象。如果您在调用 pool.map
时没有可用的令牌,那么惯用的想法是创建一个 Queue
以便稍后将令牌发送到您的进程。您的进程可以位于 Queue
的另一端并在发出请求之前等待令牌。
TLDR:您描述的方式 - 不 - 这是不可能的。
每当你分叉一个进程(即通过创建这些进程的池)时,内存中的所有数据都会被复制到一个分叉中(即不被引用)。
因此,您对原始负载所做的任何更改都不会影响分叉的副本。
这里有三个选项:
- 使用线程池(线程共享内存):https://docs.python.org/3/library/threading.html
- 使用 IPC 结构:https://pymotw.com/2/multiprocessing/communication.html
- 在创建进程池之前将身份验证令牌分配给自己。这将确保自己的副本将包含令牌。