2015-07-06 4 views
3

Итак, в последнее время я экспериментировал с модулем многопроцессорности. Я написал этот сценарий, чтобы проверить это:Многопроцессорность Python: Объект процесса не вызываемый

from multiprocessing import Process 
from time import sleep 

def a(x): 
    sleep(x) 
    print ("goo") 

a = Process(target=a(3)) 
b = Process(target=a(5)) 
c = Process(target=a(8)) 
d = Process(target=a(10)) 

if __name__ == "__main__": 
    a.start() 
    b.start() 
    c.start() 
    d.start() 

Однако, когда я пытаюсь запустить его, он выдает эту ошибку:

goo 
Traceback (most recent call last): 
    File "C:\Users\Andrew Wong\Desktop\Python\test.py", line 9, in <module> 
    b = Process(target=a(5)) 
TypeError: 'Process' object is not callable 

... И я не могу сказать, что происходит. Кто-нибудь знает, что произошло, и как я могу это исправить?

ответ

4

передать аргументы функции, которая проходила по Process делается по-разному - смотря на documentation показывает:

from multiprocessing import Process 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    p = Process(target=f, args=('bob',)) # that's how you should pass arguments 
    p.start() 
    p.join() 

Или в вашем случае:

from multiprocessing import Process 
from time import sleep 

def a(x): 
    sleep(x) 
    print ("goo") 

e = Process(target=a, args=(3,)) 
b = Process(target=a, args=(5,)) 
c = Process(target=a, args=(8,)) 
d = Process(target=a, args=(10,)) 

if __name__ == "__main__": 
    e.start() 
    b.start() 
    c.start() 
    d.start() 

Дополнение
Хорошая уловка от Люка (в комментариях ниже) - вы переопределяете функцию a с именем переменной a при совершении операции:

a = Process(target=a, args=(3,)) 

Необходимо использовать другое название.

+0

Это не решит проблему. Он запускает первый процесс, но не запускает другие, что приводит к той же ошибке: TypeError: объект «Process» не может быть вызван. Я также изучаю, что вызвало эту проблему, так как это делает документация. – DJanssens

+3

Побей меня; Быстрая заметка об этом, есть конфликт имен между 'def a (x)' и 'a = Process ...'. Переименование переменной или функции исправляет это, и я запускаю его локально. @DJanssens важна конечная запятая в кортеже args, она не будет работать без нее. –

+0

Исправление конфликта имен разрешает проблему Люка Меррета! nice one;) Я предлагаю, чтобы кто-то публиковал это как реальный ответ, или @alfasin обновляет его. – DJanssens

Смежные вопросы