如何从一个流程发信号到另一个流程?

时间:2016-05-06 08:02:24

标签: python multithreading multiprocessing gevent slack-api

我正在写一个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会破坏它。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果您安装'psycogreen'软件包并调用psycogreen.gevent.patch_psycopg()以使psycopg2驱动程序与Gevent完美匹配,则可以将Gevent与pgpubsub一起使用。我的ToDo应用程序中有一个示例https://bitbucket.org/btubbs/todopy-pg,它同时使用Gevent和pgpubsub。