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

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

Почему не использовать queue? Одни треды туда кладут, другой в цикле читает оттуда.
dreamer-s
Я думал об этом. Но. Заранее количество тредов мне не известно, плюс может еще по пути парочка появиться. С этим как-то разберусь, ладно. А вот параллельное обрабатывание инфы? Ведь если я положу их в очередь, то они поочередно и будут обрабатывать? Или я кое-что не допонял?
Soteric
Обрабатываться они будут параллельно. Считайте что у вас коробка яблок и несколько едоков. Брать из коробки будут все по-очереди, а жевать параллельно :)
odnochlen
Soteric
а жевать параллельно
Жевать тоже будут поочередно, ибо GIL.
Если все упирается в проц, а не в диск/сеть/итд, то питон - не лучший выбор.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB