2016-05-06 5 views
0

Я пишу Slack bot, где команды могут зарегистрироваться, чтобы добавить этого бота, чтобы служить своей команде.Как подать сигнал от одного процесса другому?

У меня все работает, но последний кусок остается, когда им приходится регистрироваться через 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 url, чтобы зарегистрировать команду, как обсуждалось выше.

api.add_resource(OAuth, '/oauth') 

Проблема в том, что это будет работать под сервером uwsgi под другим процессом. Как это может создать экземпляр нового бота для команды, которая только что подписалась в том же процессе, что и каждый другой бот?

я, возможно, нужно сделать что-то вроде этого:

Инстанцировать новый бот для новой команды:

bot = RtmBot(team.bot_access_token, team.bot_user_id) 

, а затем икру, что:

gevent.spawn(bot.start) 

Но если бы я сделал это в контексте uwsgi, этот бот не будет запущен в контексте демона.

Я не уверен, что эту проблему можно решить напрямую с помощью библиотеки gevent. Мне нужен был какой-то шаблон паба между процессом uwsgi и демоном.

Следовательно, я попытался решить эту проблему, используя pgpubsubhttps://bitbucket.org/btubbs/pgpubsub. Однако он работает только в одном потоке, и gevent его разрывает.

Любые идеи, пожалуйста?

ответ

0

Вы можете использовать Gevent с pgpubsub, если вы установите пакет psycogreen и вызовите psycogreen.gevent.patch_psycopg(), чтобы драйвер psycopg2 отлично играл с Gevent. В моем приложении ToDo есть пример: https://bitbucket.org/btubbs/todopy-pg, в котором используются как Gevent, так и pgpubsub.