2016-05-06 1 views
-1

Может ли кто-нибудь быть таким добрым и дать мне знать, как параллельно запускать запущенные задачи? вот мое решение, с последовательным решением:python tornado queue toro task, потребляющий параллельно

https://gist.github.com/dzizes/4c23ba4c2cd7bfbeff643c0cb85749c7

+0

Что вы думаете? Что-то не так с сутью, которую вы представили, с которой вам нужна помощь? –

ответ

0

Вам нужно запустить несколько рабочих. Эта линия начинается один работник сопрограмму:

io_loop.run_sync(mongoQueue.worker) 

Вместо этого, сделать что-то вроде:

@gen.coroutine 
def workers(self): 
    futures = [self.worker() for _ in range(CONCURRENT)] 
    yield futures    

Тогда:

io_loop.run_sync(mongoQueue.workers) 

Я бы переместить работу заполнения очереди из рабочих вместо этого:

@gen.coroutine 
def producer(self): 
    while self.running: 
     yield self.load_work() 

Это более близко напоминает the standard consumer-producer code in the Tornado docs. Затем обновить workers так нерестится производителя:

@gen.coroutine 
def workers(self): 
    IOLoop.current().spawn_callback(self.producer) 
    futures = [self.worker() for _ in range(CONCURRENT)] 
    yield futures  

См the docs for why we use spawn_callback to spawn a coroutine. Вам нужно будет установить self.running True в начале и решить, когда закончить продюсер, установив self.running False. Вам также нужно решить, как закончить рабочие сопрограммы.

Пара других исправлений к вашему коду. Во-первых, не путайте себя, называя сопрограмму со значением _thread: ваш код является однопоточным, и он достигает параллелизма с помощью сопрограмм. Во-вторых, вам не нужно gen.sleep, максимальный размер очереди будет дросселировать производителя.

+0

действительно полезно. Я сделал адаптацию, пожалуйста, посмотрите: https://gist.github.com/dzizes/4c23ba4c2cd7bfbeff643c0cb85749c7 Я не уверен, где установить self.running правильно. производитель/load_work() должны постоянно работать - рабочие задания (вставки в db) поступают из другого приложения: теперь выглядит, что производитель производит все задания (7), а потребитель потребляет задания (7) и т. д. – user2870687

+0

Set self.running = Истина в начале вашего приложения и установите self.running = False, когда пришло время для выхода вашего приложения. –

+0

но я не заканчиваю применение. он работает как деамон. когда я запускаю его без сна, он потребляет полный процессор. – user2870687