Уведомления

Группа в Telegram: @pythonsu

#1 Май 18, 2010 16:58:49

alexlp
От:
Зарегистрирован: 2009-11-12
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

python processing

Добрый день.
Мне необходимо провести вычисления, пользуясь книжкой написал следующее:

import re, os, sys
from processing import Process, Queue

numprocs = 3

result = []

def icount():
q = Queue()
tempList = [1446, 966, 869, 1283, 1575, 1675]

def f(i,q):
while True:
if q.empty():
sys.exit()
serv = q.get()
result.append(calculate(serv))
# print str(calculate(serv))

for item in tempList:
q.put(item)

for i in range(numprocs):
p = Process(target=f, args=[i,q])
p.start()

p.join()

def calculate(s_id):

...вычисления по s_id...

return {'s_id': s_id, 'cc': data})

if __name__ == '__main__':
icount()
Исходные данные: tempList =
Далее элемент из списка считается в calculate(). Все работает (если как по книжке заканчивается print result), но мне надо получить список из всех “вычислений”. Программа создает число result равное числу numprocs следовательно result.append() получается 3 набора данных (по примеру). Как всё в единый список свести?



Офлайн

#2 Май 18, 2010 19:03:28

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

python processing

Если я правильно понял задачу, то как-то так:

import time
from multiprocessing import Process, Queue

def icount(tlist, numprocs):

def f(i):
result = []
while not inq.empty():
result.append((calculate(inq.get())))
time.sleep(1)
outq.put({i: result})

inq = Queue()
outq = Queue()

for item in tlist:
inq.put(item)

processes = []
for i in range(numprocs):
p = Process(target=f, args=[i])
p.start()
processes.append(p)

for p in processes:
p.join()

result = []
while not outq.empty():
result.append(outq.get())

return result

def calculate(s_id):
return {'s_id': s_id, 'cc': s_id}

if __name__ == '__main__':
print icount([1446, 966, 869, 1283, 1575, 1675], 3)
PS: sleep(1) я вставил, чтобы результат был покрасивше. Если его убрать, то как правило один процесс всю входную очередь выедает.



Отредактировано (Май 18, 2010 19:05:03)

Офлайн

#3 Май 18, 2010 22:55:56

alexlp
От:
Зарегистрирован: 2009-11-12
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

python processing

Спасибо всё работает.

Такой вопрос, а multiprocessing от processing чем отличается? По скорости вроде одинаково



Офлайн

#4 Май 18, 2010 23:41:40

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

python processing

Это одно и то же. По-моему до 2.6 он был отдельным модулем processing, а в 2.6 его включили как multiprocessing.



Отредактировано (Май 18, 2010 23:43:18)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version