2016-07-06 3 views
1

У меня есть функция, которая принимает список R. В этой функции, я определил задачу оптимизации с использованием «мякоти», Это моя функция:многопоточность в Python с мякотью

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) 

Но, я хочу использовать многопоточность вместо цикла. Таким образом, я использовал:

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 (вместо одного в приведенном выше коде). Таким образом, многопоточность - большая помощь для меня.

+0

"Но это дает мне некоторые ошибки." Пожалуйста, добавьте * сообщение об ошибке. Всегда помогайте людям помочь вам. – MisterMiyagi

+0

@MisterMiyagi Я добавил ошибку. Благодарю. –

+0

Вы уверены, что это полностью связано с резьбой? Просмотрите такие темы, как http://stackoverflow.com/questions/32688324/pulpsolvererror-pulp-error-while-trying-to-execute-glpsol-in-python-2-7, чтобы попытаться заранее отладить сообщение об ошибке. – Tttt1228

ответ

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)) 
Смежные вопросы