我正在写一个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)
然后我在nonblocking 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的上下文中这样做,那个bot将不会在守护进程的上下文中运行。
我不确定这个问题是否可以直接用gevent库解决。 我需要以某种方式在uwsgi进程和守护进程之间使用pub子模式。
因此,我尝试使用pgpubsub
https://bitbucket.org/btubbs/pgpubsub解决此问题。但是它只能在同一个线程中工作,而gevent会破坏它。
有什么想法吗?
答案 0 :(得分:0)
如果您安装'psycogreen'软件包并调用psycogreen.gevent.patch_psycopg()以使psycopg2驱动程序与Gevent完美匹配,则可以将Gevent与pgpubsub一起使用。我的ToDo应用程序中有一个示例https://bitbucket.org/btubbs/todopy-pg,它同时使用Gevent和pgpubsub。