Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 19, 2012 11:13:06

dreamer-s
Зарегистрирован: 2012-08-13
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Поставить в очередь с потоков

Здравствуйте. Люди, помогите. Недавно изучаю питон, а тут уже полторы недели мучаюсь, третий день не сплю и уже туплю по-страшному)) задача тривиальная. Есть несколько потоков и они передают в очередь данные. Очередь в отдельном потоке. Эта очередь по мере поступления данных обрабатывает их и производит некоторые действия. Например запись в файл. Я сделал какой-то пример,, там просто вывод на экран, по-моему он не очень хорош… предыдущие “творения” удалил…

import threading, queue
import time
class queueThread(threading.Thread):
    def __init__(self, que):
        super(queueThread, self).__init__()
        self.que = que
    def somefunc(self, item):
        print(item)
    def run(self):
        while True:
            while True:
                time.sleep(1)
                try:
                    item = self.que.get_nowait()
                except queue.Empty:
                    break
                else:
                    self.somefunc(item)  
                    self.que.task_done()
class ThreadClass(threading.Thread):
    def __init__(self, some_var, que):
        super(ThreadClass, self).__init__()
        self.some_var=some_var
        self.que = que
    def run(self):
        t=self.some_var
        self.que.put_nowait(t)
que = queue.Queue()
q=queueThread(que)
q.daemon=True
q.start()
while True:
    var='a'
    t = ThreadClass(var, que)
    t.daemon=True
    t.start()
    que.join()
    var='b'
    w=ThreadClass(var, que)
    w.daemon=True
    w.start
    que.join()
    time.sleep(3)
Могли бы помочь разобраться?

Офлайн

#2 Авг. 19, 2012 15:46:27

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Поставить в очередь с потоков

В чем конкретно вопрос? Что-то не работает или работает, но непонятно как?



Офлайн

#3 Авг. 19, 2012 19:48:44

dreamer-s
Зарегистрирован: 2012-08-13
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Поставить в очередь с потоков

Суть такова, что в очередь ложу некоторые данные с разных потоков. Например идет сохранение информации с разных потоков в файл. Пусть queue.get будет в отдельном потоке, а queue.put в иных потоках, что обрабатывают инфу и необходимо записать в файл. Что бы файл не был открыт двумя потоками сразу (вдруг так), не производилась одновременная запись….. Я просто ложу данные в очередь, а там по мере поступления по порядку она обрабатывается. В этом примере создаю 3 потока, в одном реализован queue.get в цикле, постоянно принимает данные из очереди, а если except —>break и заново. И два других потока, первому передаю “a”, а второму — “b”… у меня постоянно будет выводит “а”. Как правильно реализовать задачу?

Офлайн

#4 Авг. 19, 2012 20:00:20

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Поставить в очередь с потоков

Зачем этот велосипед?

Почему не использовать queue? Одни треды туда кладут, другой в цикле читает оттуда.

Офлайн

#5 Авг. 19, 2012 20:21:08

dreamer-s
Зарегистрирован: 2012-08-13
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Поставить в очередь с потоков

Я думал об этом. Но. Заранее количество тредов мне не известно, плюс может еще по пути парочка появиться. С этим как-то разберусь, ладно. А вот параллельное обрабатывание инфы? Ведь если я положу их в очередь, то они поочередно и будут обрабатывать? Или я кое-что не допонял?

Офлайн

#6 Авг. 19, 2012 20:46:53

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Поставить в очередь с потоков

Обрабатываться они будут параллельно. Считайте что у вас коробка яблок и несколько едоков. Брать из коробки будут все по-очереди, а жевать параллельно :)



Офлайн

#7 Авг. 19, 2012 21:55:45

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Поставить в очередь с потоков

Soteric
а жевать параллельно
Жевать тоже будут поочередно, ибо GIL.
Если все упирается в проц, а не в диск/сеть/итд, то питон - не лучший выбор.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version