Форум сайта python.su
Стоит задача обработать несколько bmp файлов и данные с них сохранить в txt.
Как понимаю выглядеть это должно примерно так:
import PIL
from PIL import Image
from Queue import Queue
from threading import Thread
queue = Queue()
#Sozdaem ochered kartinok & imen failov
name = ["1.bmp", "2.bmp", "3.bmp", "4.bmp", "5.bmp", "6.bmp", "7.bmp", "8.bmp", "9.bmp", "0.bmp"]
mozg = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
def perc(i, q):
while True:
bmp = q.get()
print "Testing"% (i, bmp)
image = Image.open(bmp)
image.getcolors()
for i in range(num_threads):
worker = Thread(target=perc, args=(i, queue))
worker.setDaemon(True)
worker.start()
for bmp in name:
queue.put(bmp)
queue.join()
Отредактировано (Май 22, 2010 20:50:04)
Офлайн
Трудно сказать. Непонятно вообще что вы делаете. Зачем name и mozg, которые нигде не используются? Где функция pinger? Где зовется perc? В общем нужно более внятное объяснение.
Офлайн
А зачем мультипоточность? Чтобы все помедленнее работало и более феерично глючило? 8-)
Если используете queue.join() - потрудитесь делать еще и queue.task_done()
Потоки-демоны - зло. Вполне можно обойтись нормальными, с .join в конце работы.
Офлайн
Ed, извините, это я нашел исходный код реализующий поточность и некорректно вклеил в свою задачу.Поправил.
Андрей Светлов, а можете на примере показать?
Отредактировано (Май 22, 2010 20:53:00)
Офлайн
Теперь немного получше. Ну и что нужно сделать? Зачем еще одна очередь? Пишите прям в выходные файлы в том же потоке, где читаете.
Кстати, я бы посоветовал использовать multiprocessing.Pool http://docs.python.org/library/multiprocessing.html?highlight=pool#module-multiprocessing.pool вместо Treading. Если у вас больше одного core, то будет быстрее. Да и кода поменьше.
Офлайн
Показать - что?
multiprocessing.Pool +1
Офлайн
Андрей Светлов & Ed, прошу прощения, я начинающий питонер, не совсем понимаю как писать в тот же поток. Можно пример кода?
Офлайн
Что, тоже студент, что ли?
Какие данные нужно сохранить-то? В текущем коде только getcolors зовется.
Офлайн
Ed, вот их и нужно сохранить по файлам с именами от 0 до 9
Офлайн
Ну так вот, можно в очередь затолкать просто цифры range(10). В функции со странным названием perc нужно взять цифру из очереди, сделать из нее имя файла путем добавления .bmp, достать из файла цвета с помощью PIL, записать их в файл с именем, совпадающим с цифрой, которую взяли из очереди. Вот и все. Если попользоваться multiprocessing.Pool, то кода будет совсем чуть-чуть.
Пробуйте, показывайте здесь результат, обсудим.
Отредактировано (Май 23, 2010 14:05:55)
Офлайн