Вы не переопределили метод run
. Есть два способа, с помощью которых процессы (или потоки) могут выполнять код:
- Создать процесс с указанием цели
- Подкласс процесса, переопределяющий метод
run
.
Переопределение __init__
просто означает, что все ваши процессы одеты и некуда идти. Он должен использоваться для придания ему атрибутов, необходимых для выполнения того, что ему нужно, но не должен указывать задачу, которую нужно выполнить.
В вашем коде все тяжелые операции выполняются в этой строке:
exec('worker'+str(i)+' = Worker(tmp)')
и здесь ничего не делается:
exec('worker'+str(i)+'.start()')
Так что проверка результатов с помощью exec('print worker'+str(i)+'.result[0]')
должна дать вам что-то значимое, но только потому, что код, который вы хотите выполнить , был выполнен , но при построении процесса, а не при запуске процесса.
Попробуйте это:
class Worker(Process):
# example data transform
def process(self, x): return (x * 2) / 3
def __init__(self, list):
self.data = list
self.result = []
super(Worker, self).__init__()
def run(self):
self.result = map(self.process, self.data)
EDIT:
Хорошо ... так что я просто летал, основываясь на своих инстинктах, и все они были не правы. Что мы оба не поняли о процессах, так это то, что вы не можете напрямую делиться переменными. Все, что вы передаете новому процессу, читается, копируется и исчезает навсегда. Если вы не используете один из двух стандартных способов обмена данными: очереди и каналы . Я немного поиграл, пытаясь заставить твой код работать, но пока не повезло. Я думаю, что это поставит вас на правильный путь.