2017-01-09 6 views
0

Я пытаюсь сделать простой пример многопроцессорности. В котором я пытаюсь запустить простой сценарий оболочки в многопроцессорном пуле потоков. Сценарий выполняется, но вывод скрипта не возвращается должным образом вызывающей функции.Проблема со значением, возвращаемым функцией python

def call_proc(cmd): 
    p = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    out, err = p.communicate() 
    print "Out" +out 
    print "Error" +err 
    return (out, err) 


if __name__ == "__main__": 
    pool = ThreadPool(multiprocessing.cpu_count()) 
    results = [] 
    for i in range(1,5): 
     results.append(pool.apply_async(call_proc ("./test.sh"))) 

    # Close the pool and wait for each running task to complete 
    pool.close() 
    pool.join() 
    print results 
    for result in results: 
     out, err = result.get() 
     print("out: {} err: {}".format(out, err)) 

Я получаю следующий результат наряду с исключением, когда я запустить питон скрипт

Output :Test Done

Error :

Output :Test Done

Error :

Output :Test Done

Error :

Output :Test Done

Error :

Traceback (most recent call last): File "osshm_multiprocess.py", line 25, in out, err = result.get() File "/usr/lib64/python2.6/multiprocessing/pool.py", line 422, in get raise self._value TypeError: 'tuple' object is not callable

Не уверен, где это происходит не так.

+1

Вы забыли запятая между 'call_proc' и' (»./test. sh ")' - теперь вы выполняете 'call_proc (" ./ test.sh ")', и в его результате используется аргумент 'apply_async'. – furas

ответ

1

Для меня вы забыли запятой , между call_proc и ("./test.sh")

Теперь вы выполняете call_proc("./test.sh") и ее результат используется a apply_async аргумент

Вы делаете что-то вроде этого

function_result = call_proc("./test.sh") 
pool.apply_async(function_result) 

Но вы должны сделать

function_name = call_proc 
function_args = ("./test.sh",) # tuple with arguments 
pool.apply_async(function_name, function_args) # <-- comma between name and args 

так что вам нужно

pool.apply_async(call_proc, ("./test.sh",)) 
0

кажется, что вы уже получить кортеж из

out, err = result.get() 

удалить вызова get()