Многопроцессорность PubNub и Python. Процесс не совместим?

1

Я пытаюсь получать сообщения от PubNub внутри процесса, используя Python multiprocessing.Process package (Python 3.5 на Raspbian 9 - Stretch).

Следующее отлично работает как отдельная программа или в потоке с использованием пакета потоков Python. Однако он не работает с многопроцессорной обработкой.

Я что-то упустил или PubNub SubscriptionListener не совместим с пакетом многопроцессорности Python?

#!/usr/bin/env python3

from pubnub.pubnub import PubNub, SubscribeListener
from pubnub.pnconfiguration import PNConfiguration

import multiprocessing
import time

def PN_func():
    pnconfig = PNConfiguration()
    pnconfig.subscribe_key = 'sub-mykey'
    pubnub = PubNub(pnconfig)

    print('Pubnub multiprocess subscriber initiated...')

    class Listener(SubscribeListener):
        def message(self, pubnub, data):
            print("From Multiprocess function message: ", data.message)

    pubnub.add_listener(Listener())
    pubnub.subscribe().channels('my_channel').execute()

if __name__ == '__main__':
    mp = multiprocessing.Process(target=PN_func)
    mp.start()
    mp.join()
  • 1
    Не могли бы вы быть более конкретным, чем не работает ? Вы получаете сообщение об ошибке? Какое поведение вы ожидаете и какое поведение вы видите?
  • 0
    @ BoarGules У меня есть отдельная программа, которая генерирует сообщение каждые четыре секунды. Если я запускаю вышеупомянутое (используя, конечно, мой личный дополнительный ключ) в потоке или автономном процессе, я получаю мое сообщение для печати инициации, а затем каждые четыре секунды оно печатает сообщение. Вышеприведенное просто выводит мое сообщение об инициализации на терминал «Инициирован многопроцессный подписчик Pubnub ...», а затем программа прекращает возвращаться к приглашению оболочки Linux. Сообщение об ошибке не отображается.
Показать ещё 2 комментария
Теги:
python-multiprocessing
pubnub

1 ответ

1
Лучший ответ

Мультипроцессор PubNub и Python

Мне не удалось заставить SDK обрабатывать синхронные запросы внутри многопроцессорного рабочего. Однако следующий трюк работает очень хорошо:

Использование многопроцессорности и совместной работы с PubNub

Простой файл example.py содержит следующий код:

import multiprocessing
import requests

SUB_KEY  = 'demo'
CHANNELS = ['my_channel']

def main():
    mp = multiprocessing.Process(target=subscriber)
    mp.start()
    mp.join()

def subscriber():
    timetoken = '0' ## pointer to last message received
    while True:
        url = "/".join([
            'https://ps.pubnub.com/subscribe'
        ,   SUB_KEY
        ,   ",".join(CHANNELS)
        ,   '0'
        ,   timetoken
        ])

        print(url)

        response  = requests.get(url)
        data      = response.json()
        messages  = data[0]
        timetoken = data[1]

        print(data)

if __name__ == '__main__': main()

Выход многопроцессорного дочернего процесса

> python example.py 
https://ps.pubnub.com/subscribe/demo/my_channel/0/0
[[], u'15336927707090912']
https://ps.pubnub.com/subscribe/demo/my_channel/0/15336927707090912
[[{u'text': u'hey'}], u'15336927943808959']
https://ps.pubnub.com/subscribe/demo/my_channel/0/15336927943808959
[[{u'text': u'hey'}], u'15336927945476647']
https://ps.pubnub.com/subscribe/demo/my_channel/0/15336927945476647
[[{u'text': u'hey'}], u'15336927946996529']
https://ps.pubnub.com/subscribe/demo/my_channel/0/15336927946996529
[[{u'text': u'hey'}], u'15336927948441519']
https://ps.pubnub.com/subscribe/demo/my_channel/0/15336927948441519
[[{u'text': u'hey'}], u'15336927950007602']
https://ps.pubnub.com/subscribe/demo/my_channel/0/15336927950007602
  • 0
    @Stephen_Blum спасибо, что ответили мне решением, которое работает. Планируется ли обновление SubscribeListener для работы с мультипроцессором. Процесс?
  • 0
    Это как-то связано с request_sync vs request_async . Я добавлю подробности об ошибке и отправлю в git-репо.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню