【发布时间】:2016-09-01 05:24:55
【问题描述】:
我正在编写一个 Slack 机器人,团队可以在其中注册以添加该机器人来为他们的团队服务。
我已经完成了所有工作,但最后一部分仍然存在,因为他们必须通过 oauth 注册才能真正启动该机器人。
我最初以这种方式为每个团队实例化一个机器人:
teams = self.session.query(Team).all()
for team in teams:
bot = RtmBot(team.bot_access_token, team.bot_user_id)
self.bots.append(bot)
然后我在非阻塞 gevent 中运行机器人:
for bot in self.bots:
events.append(gevent.spawn(bot.start))
gevent.joinall(events)
通过 Python daemon 运行良好。
我还提供了一个 oauth 网址,以便如上所述注册团队。
api.add_resource(OAuth, '/oauth')
问题是这将在 uwsgi 服务器下运行,在不同的进程下。它怎么可能为刚刚在与其他机器人相同的流程中注册的团队实例化一个新机器人?
我可能需要这样做:
为新团队实例化一个新机器人:
bot = RtmBot(team.bot_access_token, team.bot_user_id)
然后生成:
gevent.spawn(bot.start)
但如果我在 uwsgi 的上下文中这样做,该机器人将不会在守护进程的上下文中运行。
我不确定这个问题是否可以直接用 gevent 库解决。 我需要在 uwsgi 进程和守护进程之间建立一个 pub sub 模式。
因此我尝试使用pgpubsub https://bitbucket.org/btubbs/pgpubsub 来解决这个问题。但是它只能在同一个线程中工作,并且 gevent 会破坏它。
有什么想法吗?
【问题讨论】:
标签: python multithreading multiprocessing gevent slack-api