2016-05-04 9 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)) 

しかし、無限ループを使用するとすぐに、1つのボットIDが表示されます。あたかも他の仕事が終わるのを待っているかのように思えますが、これは意味がありません。私はgevent.joinallが両方とも並行して動くと思った。

お願いします。レコードの

UPDATE

、私はこの仕事をするためにwhileループの最後の行にgevent.sleep(0.1)を追加する必要がありました。 Gevent introductionから

答えて

2

つだけgreenletは、これまで任意の時点で実行されています。

基本的には、あなたが探しているのは非同期操作ではない並列処理だと思います。多分、マルチプロセッシングモジュールを使う方が良いでしょう。

+0

ありがとう、実際に私は、 'joinall()'が並行処理が同時に実行されていることを発見しました。これは並列性ではない。したがって、ループの最後に 'gevent..sleep(0.1)'を追加しました。今はうまく動いています。あなたの意見は何ですか、この目的のためにその規模ですか?なぜなら、その入力関数が十分単純であれば、マルチプロセッシングはたくさんのリソースを必要とするからです(メモリ単位)。 – Houman

+0

@Houmanです。しかし、マシンごとのボット数の上限をテストする必要があります。 – lesingerouge

関連する問題