2016-05-04 20 views
1

我對Gevent/Greenlet很新,並且已經通過了教程。 我想爲每個註冊團隊運行一個bot。具有無限循環的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)) 

但是,只要我使用無限循環,我只能看到一個機器人的ID正在顯示。看起來好像另一個任務正在等待這個完成,這是沒有意義的。我認爲gevent.joinall會同時運行。

對此有什麼建議嗎?

UPDATE

爲了記錄在案,我不得不對while循環,使這項工作的最後一行添加gevent.sleep(0.1)

回答

2

Gevent introduction

只有一個greenlet是有史以來在任何特定時間運行。

基本上我認爲你所尋找的是並行而不是異步操作。也許更適合使用多處理模塊。

+0

謝謝,實際上我發現'joinall()'是併發運行在同一時間。這不是並行性。因此,我在循環結尾添加了'gevent..sleep(0.1)',現在它工作得很好。你的意見是什麼,這是爲了達到這個目的嗎?因爲多處理佔用大量資源(內存) – Houman

+0

@Houman如果輸入函數足夠簡單,它應該工作得很好。但是你應該測試每臺機器的機器人數量的限制。 – lesingerouge