2016-01-08 3 views
3

Прошу прощения, если это неправильный способ выразить это, но я не уверен, с чего начать. Если этот вопрос нужно переформулировать, я обязательно это сделаю.Доступ к коду Python, который работает

Я только что закончил писать фрагмент кода, который собирает данные с разных серверов. В настоящее время он работает, и я хотел бы начать писать другие фрагменты кода, которые могут получить доступ к собираемым данным. Очевидно, что я могу сделать это, сбросив данные в файлы, и мой код анализа данных читает файлы, хранящиеся на диске. Однако для некоторых форм моего анализа я хотел бы иметь что-то более близкое к данным в реальном времени. Есть ли способ получить доступ к классу из моей части кода сбора данных без явного создания экземпляра? Я имею в виду, могу ли я создать один кусок кода, чтобы начать сбор данных, а затем написать другие фрагменты кода, которые могут получить доступ к классу сбора данных, не останавливая и не перезапуская кусок кода для сбора данных?

Надеюсь, это имеет смысл. Я понимаю, что данные могут быть просто записаны на диск, и я мог бы делать такие вещи, как только мои каталоги поиска кода анализа данных для изменений. Тем не менее, мне просто интересно узнать, можно ли сделать что-то подобное.

+0

Знаете ли вы о 'Apache Kafka' [Учебник] (http://kafka-python.readthedocs.org/en/latest/usage.html) – python

+1

Это похоже на' Producer проблемы Consumer'? См. Этот пример [Продюсер-производитель] (http://agiliq.com/blog/2013/10/producer-consumer-problem-in-python/) – python

+0

Это выглядит так, как я хочу. Я так и не подумал об этом, но я думаю, что это правильная идея. Моя первоначальная идея состояла в том, чтобы просто запустить сборщик данных, а затем отправить сигнал для запроса определенного количества/типа данных из сборщика данных. – FirstPrime

ответ

3

Это похоже на проблему Producer Consumer.

Задача производителя состоит в том, чтобы сгенерировать кусок данных, положить его в буфер и начать заново. В то же время потребитель потребляет данные (т. Е. Удаляя его из буфера) по одной штуке за один раз

Улов здесь «В то же время». Таким образом, производитель и потребитель нуждаются в для запуска одновременно. Следовательно, нам нужны отдельные потоки для производителя и Потребитель.

Я беру код из приведенной выше ссылки, вы должны пройти его для получения дополнительной информации.

from threading import Thread 
import time 
import random 
from Queue import Queue 

queue = Queue(10) 

class ProducerThread(Thread): 
    def run(self): 
     nums = range(5) 
     global queue 
     while True: 
      num = random.choice(nums) 
      queue.put(num) 
      print "Produced", num 
      time.sleep(random.random()) 


class ConsumerThread(Thread): 
    def run(self): 
     global queue 
     while True: 
      num = queue.get() 
      queue.task_done() 
      print "Consumed", num 
      time.sleep(random.random()) 


ProducerThread().start() 
ConsumerThread().start() 

Объяснение:

  • Мы используем экземпляр Queue (очередь далее) .Queue имеет условие и что условие имеет блокировку. Вам не нужно беспокоиться о Условие и блокировка, если вы используете очередь.

  • Производитель вводит данные в очередь для размещения данных в очереди.

  • put() имеет логику для получения блокировки перед вставкой данных в очередь .

  • Также put() проверяет, заполнена ли очередь. Если да, то он вызывает
    wait() внутренне, и поэтому производитель начинает ждать.

  • Потребительские потребители получают.

  • get() получает блокировку перед удалением данных из очереди.

  • get() проверяет, пуста ли очередь. Если да, то он ставит потребителя в состояние ожидания .

+0

Поскольку я читаю это снова, мне интересно, действительно ли он отвечает на мой вопрос. Возможно, я ошибаюсь. Должен ли я остановить и перезапустить поток данных, чтобы мой новый поток анализа данных мог получить доступ к очереди? – FirstPrime

+0

Если вам нужен конкретный ответ, тогда вам нужно сначала написать свой собственный код, иначе это будет сложно. – python

+0

Я не вижу, как код будет более полезен, чем описание здесь. Я хочу начать один кусок кода Python и позволить ему работать непрерывно. Пока он работает, я хочу написать еще один фрагмент кода Python, который я могу запустить в любое время, и получить доступ к первому фрагменту кода, не останавливая первую часть кода. – FirstPrime

Смежные вопросы