2013-04-22 4 views
1

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

  • В случае написания с одной стороны и чтения от другого, у Python есть проблемы с ним?
  • В случае возникновения проблемы с синхронизацией мне нужно заблокировать процессы чтения/записи? Любой другой способ Я должен это сделать?
  • Что лучше всего использовать, резьбу или резьбу?
  • В качестве следующего шага я буду читать 100 сайтов и обновлять 100 объектов, и читать из 100 циклов для изменений. Рекомендуется ли использовать Multiprocessing с начала , чтобы я мог масштабироваться без проблем? Нужно ли мне при чтении и записи?

Любая помощь приветствуется.

+0

вы будете использовать Python, это правильно? Я добавляю тег языка python. –

+0

Если можно объединить обе задачи в один цикл, это намного проще, чем использование потоков. – Aya

+0

нет, не рекомендуется сливаться в один цикл. Обе стороны полностью асинхронны, поэтому вы слушаете, один для обработки. Итак, теперь у меня есть 100 сайтов для прослушивания и 100 для обработки. Все имеют разные времена выполнения. –

ответ

0

Короткий ответ: все, что вы думаете, будет понятно для вас. Смысл, ваш код должен иметь смысл для вас в целях обучения.

Вот пример, легкий и простой в использовании. Получение значения из и нити легко .. Это не актуально многопоточность Тхо (одно ядро ​​CPU)

from threading import * 

class worker(Thread): 
    def __init__(self, input=0): 
     self.input = input 
     Thread.__init__(self) 
     self.start() 

    def run(self): 
     while 1: 
      self.input += 1 

x = worker(-100) 
y = worker(x.input) 

print y.input 

Это просто пример, чтобы показать, что Y нить может получить доступ к данным в x. на практике это может быть опасно, учитывая, что оба потока будут обновлять одну и ту же переменную :) (Короче говоря: -100 будет рассчитываться два раза за цикл, -98, -96, -94 и т. д.)

  • Не будет охватывать несколько процессоров
  • Easy (доступ к данным по потокам прост)
  • Логический код, если вы не знакомы с системами очередей или распределенными системами
  • Возникнет ошибка, если ОС не сможет создать больше потоков («ограничение»)
+0

«Это не актуально многопоточное tho» - но это так! Ограничение говорит, что только один сразу может выполнить код Python. Но за пределами Python все может случиться. – Kos

+0

Все, что я знаю, это то, что exict этот код создаст асинхронный код, который может выполняться в «paralell» друг к другу, но он не будет охватывать несколько процессоров, что на самом деле не создает многопроцессорных приложений в аппаратном смысле.но вы сможете запускать программные (os) -процессорные кодовые блоки :) Это работает, нижняя строка :) – Torxed

+0

В модуле «многопроцессор» используются процессы ОС, а 'threading' - потоки ОС. Оба могут использовать многоядерные машины (если вы не используете 'threading' и Global Interpreter Lock мешает). – Kos

0
from threading import Thread 
from Queue import Queue 

class producer(Thread): 
    def __init__(self,queue): 
     Thread.__init__(self) 
     self.queue=queue 
     self.start() 
    def run(self): 
     while 1: 
      self.queue.put(update_value()) 

class consumer(Thread): 
    def __init__(self,queue): 
     Thread.__init__(self) 
     self.queue=queue 
     self.start() 
    def run(self): 
     while True: 
      value = queue.get() 
      do_whatever_you_want(value) 
queue = Queue() 
producer(queue) 
consumer(queue) 

обратите внимание, что вы можете масштабировать с помощью 100 производителя и одного потребителя (и, конечно, один очереди) 100 нитей должно быть в порядке, но все было бы иначе, если вы хотите 10000

+0

Большое спасибо, я сделаю некоторые контрольная работа. Концепция заключается в том, что одна сторона слушает 100 серверов, получает данные и обновляет связанные объекты. Другая сторона работает только в цикле для чтения и обработки данных. Я все еще не уверен, что многопроцессорность не лучше, когда процессор работает на 90%? Любой совет ? Как реагирует система, когда происходит обновление и чтение, происходит ли это сбой? Это мое большое дело. –

+0

, если у вас многоядерность и многопроцессорность лучше, если процесс связан с ЦП, очередь используется аналогично, см. Http://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes, есть блокировка в поэтому есть гарантия, что чтение и запись не могут происходить одновременно, если процесс тяжелый в потребительской стороне, у вас может быть несколько процессов, потребляющих одну и ту же очередь –

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