Python中的多线程与纸浆

时间:2016-07-06 05:51:52

标签: python multithreading

我有一个接受列表R的函数。在这个函数中,我使用“pulp”定义了一个优化问题,这是我的函数:

import pulp
from multiprocessing.dummy import Pool as ThreadPool

def optimize(R):

    variables = ["x1","x2","x3","x4"]

    costs = {"x1":R[0], "x2":R[1], "x3":R[2], "x4":R[3]}

    constraint = {"x1":5, "x2":7, "x3":4, "x4":3}

    prob_variables = pulp.LpVariable.dicts("Intg",variables,
                              lowBound=0,
                              upBound=1,
                              cat=pulp.LpInteger)


    prob = pulp.LpProblem("test1", pulp.LpMaximize)

    # defines the constraints
    prob += pulp.lpSum([constraint[i]*prob_variables[i] for i in variables]) <= 14

    # defines the objective function to maximize
    prob += pulp.lpSum([costs[i]*prob_variables[i] for i in variables])

    pulp.GLPK().solve(prob)

    # Solution
    return pulp.value(prob.objective)

要获得输出,我使用列表作为输入,输出正确:

my_input = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]

results =[]
for i in range(0,len(my_input)):
    results.append(optimize(my_input[i]))

    print("*"*20)
    print(results)

但是,我想使用多线程而不是for循环。所以,我用过:

my_input = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
pool = ThreadPool(4)
results = pool.map(optimize, my_input) 

但它给了我一些错误:

Traceback (most recent call last):
  File "/Users/Mohammad/PycharmProjects/untitled10/multi_thread.py", line 35, in <module>
    results = pool.map(optimize, my_input)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/multiprocessing/pool.py", line 260, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/multiprocessing/pool.py", line 608, in get
    raise self._value
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/multiprocessing/pool.py", line 119, in worker
    result = (True, func(*args, **kwds))
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/multiprocessing/pool.py", line 44, in mapstar
    return list(map(*args))
  File "/Users/Mohammad/PycharmProjects/untitled10/multi_thread.py", line 27, in optimize
    pulp.GLPK().solve(prob)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PuLP-1.6.1-py3.5.egg/pulp/solvers.py", line 179, in solve
    return lp.solve(self)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PuLP-1.6.1-py3.5.egg/pulp/pulp.py", line 1643, in solve
    status = solver.actualSolve(self, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PuLP-1.6.1-py3.5.egg/pulp/solvers.py", line 377, in actualSolve
    raise PulpSolverError("PuLP: Error while executing "+self.path)
pulp.solvers.PulpSolverError: PuLP: Error while executing glpsol

任何人都可以帮助我吗? 在我的实际代码中,my_input列表的长度为27(而不是上面代码中的4),对于每一个,在我的函数中,我必须执行80k优化(而不是上面代码中的一个)。因此,多线程对我来说是一个很大的帮助。

1 个答案:

答案 0 :(得分:1)

我已经看到类pulp.solvers.COIN_CMD有一个threads参数,尽管文档很简洁。看一下代码源,它似乎确实是一种向求解器提供线程的方法。

如果命名确实是问题,请考虑将给定问题的所需名称索引添加为函数的输入参数。类似的东西:

def optimize(tup): # here, tup contains (idx, R), so as to be callable using pool.map
    ...
    prob = pulp.LpProblem('test'+str(idx), pulp.LpMaximize)
    ...

然后像:

my_input = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
pool = ThreadPool(4)
results = pool.map(optimize, enumerate(my_input))