2016-05-04 12 views
1

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

for bot in self.bots: 
    events.append(gevent.spawn(bot.start)) 
gevent.joinall(events) 

Самое интересное в том, что если я не использую while true петлю, я получаю bot_id обоих ботов, показанных на консоли.

def start(self): 
     while True: 
      for reply in self.slack_client.rtm_read(): 
       self.input(reply) 
      time.sleep(0.1) 
      logger.info("Log:{0}".format(self.bot_id)) 

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

любые советы по этому просьба?

UPDATE

Для записи, я должен был добавить gevent.sleep(0.1) на последней строке в то время как петли, чтобы сделать эту работу.

ответ

2

От Gevent introduction:

только один greenlet когда-либо работает в любой момент времени.

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

+0

Спасибо, на самом деле я узнал, что 'joinall()' является одновременным запуском одновременно. Что не является параллелизмом. Поэтому я добавил 'gevent..sleep (0.1)' в конце цикла, и теперь он работает отлично. Как вы думаете, будет ли эта шкала для этой цели? Поскольку многопроцессорность требует много ресурсов (по памяти) – Houman

+0

@Houman, он должен работать очень хорошо, если эта входная функция достаточно проста. Но вы должны проверить предел количества ботов на машину. – lesingerouge