многопоточность python zerorpc - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь создать внешний интерфейс для программы на Python. Я выбрал zerorpc для связи между NodeJS и python, который работает нормально, единственная проблема, с которой я сталкиваюсь, это то, что я не могу правильно многопоточным zerorpc.
Я видел несколько постов, рассказывающих о том, как zerorpc и обычные темы не любят друг друга. Однако мой бэкэнд-сервис уже несколько продвинутый и использует несколько потоков.
Итак, теперь вопрос, возможно ли каким-то образом объединить оба, обычные потоки и zerorpc, или мне нужно переписать мой основной код, чтобы использовать ту же библиотеку потоков, что и zerorpc?
Основная проблема, с которой я столкнулся при работе с обычными потоками, заключается в том, что поток, который запускает сервер, полностью зависает и поэтому не может быть закрыт. Вот как я сейчас запускаю сервер:

self.communication_thread = Thread(target=communication_server.start_communication_server)
self.communication_thread.start()

def start_communication_server():
    global server
    addr = 'tcp://127.0.0.1:4242'
    server = zerorpc.Server(CommunicationServer())
    server.bind(addr)
    print('Created a new communicationserver running on {}'.format(addr))
    server.run()

Я также пытался убить сервер с помощью следующей функции, которая, однако, приводит к исключению, которое нежелательно

def kill_server():
    global server
    server.stop()

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 25 января 2019

zerorpc достигает параллелизма с Gevent (ioloop + сопрограммы и т. Д.). Gevent является однопоточным и после инициализации может использоваться только из потока, использованного для его инициализации. В вашем случае это поток, вызывающий server.run(). Поэтому вы должны взаимодействовать только с методами zerorpc из того же потока.

Вы можете установить обезьяньё исправление (http://www.gevent.org/intro.html#monkey-patching), которое эффективно заставит ваш Thread объект вести себя как сопрограмму. Если вы используете многопоточность только для параллельного ввода-вывода, это может быть достаточно.

В противном случае, если вам нужны потоки для параллелизма ЦП, проверенное решение состоит в использовании подпроцессоров в качестве отдельных потоков. Вы можете использовать zerorpc между вашим главным сервером и рабочими (сокеты unix здесь вполне подходят). Поскольку работники в любом случае привязаны к процессору и являются локальными, вы можете отключить пульс между Сервером и Работниками (Client/Server(heartbeat=0)).

Однако я не смог найти подробностей о том, как безопасно смешивать системные потоки и gevent.

...