Вам нужно запустить несколько рабочих. Эта линия начинается один работник сопрограмму:
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
, максимальный размер очереди будет дросселировать производителя.
Что вы думаете? Что-то не так с сутью, которую вы представили, с которой вам нужна помощь? –