使用 multiprocessing 库时,如何将资源绑定到特定进程?
When using the multiprocessing library, how do I bind resources to specific processes?
假设我有 50 个进程,我正在使用它们来操作(比方说)20000 个不同的输入值。 (我正在使用 pathos 库,我认为它的操作类似于 Python 中的多处理库。)
thread_pool = pathos.multiprocessing.ProcessingPool(threads=50)
thread_pool.map(function, inputs)
我想为每个进程创建一个 SQLAlchemy 数据库引擎(但我没有资源为每个输入值创建一个)。然后我希望使用该进程处理的所有输入都使用相同的数据库引擎。
我该怎么做?
我想出了如何使用 multiprocess
库而不是 pathos
库来做到这一点。创建进程池时,您可以指定一个 "initializer function",它在每个进程的开头运行。在这个初始化函数中,我创建了一个数据库引擎并将该引擎声明为进程的全局引擎。所以现在我每个进程只有一个引擎。
我是 pathos
和 multiprocess
的作者。事实证明 multiprocess
实际上是 pathos
使用的,但情况可能并不明显。您可以从 pathos
:
>>> import pathos
>>> pathos.pools._ProcessPool
<class 'multiprocess.pool.Pool'>
以上是直接来自 multiprocess
的原始 Pool
,而 pathos.pools.ProcessPool
是具有一些附加功能的高级包装器,但(尚未)公开所有关键字来自较低级别的参数 Pool
.
假设我有 50 个进程,我正在使用它们来操作(比方说)20000 个不同的输入值。 (我正在使用 pathos 库,我认为它的操作类似于 Python 中的多处理库。)
thread_pool = pathos.multiprocessing.ProcessingPool(threads=50)
thread_pool.map(function, inputs)
我想为每个进程创建一个 SQLAlchemy 数据库引擎(但我没有资源为每个输入值创建一个)。然后我希望使用该进程处理的所有输入都使用相同的数据库引擎。
我该怎么做?
我想出了如何使用 multiprocess
库而不是 pathos
库来做到这一点。创建进程池时,您可以指定一个 "initializer function",它在每个进程的开头运行。在这个初始化函数中,我创建了一个数据库引擎并将该引擎声明为进程的全局引擎。所以现在我每个进程只有一个引擎。
我是 pathos
和 multiprocess
的作者。事实证明 multiprocess
实际上是 pathos
使用的,但情况可能并不明显。您可以从 pathos
:
>>> import pathos
>>> pathos.pools._ProcessPool
<class 'multiprocess.pool.Pool'>
以上是直接来自 multiprocess
的原始 Pool
,而 pathos.pools.ProcessPool
是具有一些附加功能的高级包装器,但(尚未)公开所有关键字来自较低级别的参数 Pool
.