我在非线性优化领域工作,我有一个昂贵的成本函数。成本函数涉及一些令人尴尬的并行代码,我想在多个python进程中分发以逃避GIL。因为这些是独立的进程,所以它们不会从" core"继承全局命名空间/导入。处理。
我的核心流程使用了一些需要很长时间(最多1秒)才能完成的导入。对此的典型解决方案是将所需的导入迁移到并行化函数的主体中。因为它是丑陋的,我想放弃它以换取一些更加丑陋的幕后魔术来处理进口。我还想避免使用每个成本函数评估创建一个新的工作池以避免浪费(高达40%的并行实现和执行时间是进程启动和导入)。
我创建了一个小型库,允许我map
对任意数量的长期工作者进行一组函数调用,并在评估成本函数的所有迭代后丢弃/终止它们。这为multiprocessing
图书馆的Pool
或Pathos
提供了一些灵活性。
假设我有一些文件:
optimizer.py
from mymodule import a,b,c
def cost_function(parameters):
p = parameters
pt1 = a(p[0])
pt2 = b(pt1, p[1])
pt3 = c(pt2, p[2])
return pt3.results # looks like [1, 2, 3, 4, 5 ...]
给定cost_function
对象,有没有办法构建一个在其中调用的所有函数的列表,而不执行它?
包含builtins等的列表很好。迭代返回的函数列表并过滤掉内置函数相对容易,并且在给定函数名称的情况下定位源(import
的位置)。
编辑:下面是我用来产生工作流程的代码
from multiprocessing import Process
def spawn_workers(self, num_workers):
for i in range(num_workers):
Process(target=worker_fcn, kwargs=dict(config_dict=self.cfg)).start()
self
是指包含一些配置信息的类实例。