Форум сайта python.su
0
Здравствуйте. Люди, помогите. Недавно изучаю питон, а тут уже полторы недели мучаюсь, третий день не сплю и уже туплю по-страшному)) задача тривиальная. Есть несколько потоков и они передают в очередь данные. Очередь в отдельном потоке. Эта очередь по мере поступления данных обрабатывает их и производит некоторые действия. Например запись в файл. Я сделал какой-то пример,, там просто вывод на экран, по-моему он не очень хорош… предыдущие “творения” удалил…
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)
Офлайн
20
В чем конкретно вопрос? Что-то не работает или работает, но непонятно как?
Офлайн
0
Суть такова, что в очередь ложу некоторые данные с разных потоков. Например идет сохранение информации с разных потоков в файл. Пусть queue.get будет в отдельном потоке, а queue.put в иных потоках, что обрабатывают инфу и необходимо записать в файл. Что бы файл не был открыт двумя потоками сразу (вдруг так), не производилась одновременная запись….. Я просто ложу данные в очередь, а там по мере поступления по порядку она обрабатывается. В этом примере создаю 3 потока, в одном реализован queue.get в цикле, постоянно принимает данные из очереди, а если except —>break и заново. И два других потока, первому передаю “a”, а второму — “b”… у меня постоянно будет выводит “а”. Как правильно реализовать задачу?
Офлайн
14
Зачем этот велосипед?
Почему не использовать queue? Одни треды туда кладут, другой в цикле читает оттуда.
Офлайн
0
Я думал об этом. Но. Заранее количество тредов мне не известно, плюс может еще по пути парочка появиться. С этим как-то разберусь, ладно. А вот параллельное обрабатывание инфы? Ведь если я положу их в очередь, то они поочередно и будут обрабатывать? Или я кое-что не допонял?
Офлайн
20
Обрабатываться они будут параллельно. Считайте что у вас коробка яблок и несколько едоков. Брать из коробки будут все по-очереди, а жевать параллельно :)
Офлайн
14
SotericЖевать тоже будут поочередно, ибо GIL.
а жевать параллельно
Офлайн