LINUX.ORG.RU

Межпроцессное взаимодействие «из коробки» Python

 ,


0

2

Какие сейчас «искоробочные» механизмы взаимодействия процессов есть в Python?

Я пробовал ZMQ тянуть в проект, но не прижился.

Пробовал beanstalkd, слишком медленный.

Какие ещё варианты есть, не жрущие много ресурсов?

Задача - простыми JSON обмениваться.

Процессы на одной машине или нет? От этого зависят варианты ответа.

Самые простые и беспроблемные, по опыту: redis, RabbitMQ. Но это между разными машинами.

emorozov
()
Ответ на: комментарий от emorozov

На одной машине. Но требуется передавать не данные, а событие с данными. Чтобы вторая сторона могла «слушать» сокет (очередь), не расходуя ресурсов.

i_am_not_ai
() автор топика

Зачем ZMQ для локального взаимодействия? Как сказали, multiprocessing.Queue, multiprocessing.shared_memory или pickle/json через unix/tcp сокет.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

А что если нужен какой то сервер который долго запускается. Например большая модель для распознавания голосовых сообщений.

А обращался к ней надо из скриптов которые запускаться эпизодически.

theurs ★★
()

Какие ещё варианты есть, не жрущие много ресурсов?

Задача - простыми JSON обмениваться.

Файл в /tmp и не изобретайте фигни на ровном месте

pihter ★★★★★
()
Ответ на: комментарий от i_am_not_ai

Чтобы вторая сторона могла «слушать» сокет (очередь), не расходуя ресурсов.

А для этого придумали юниксовые сокеты

pihter ★★★★★
()

* UNIX domain socket
* msgget(3)

urxvt ★★★★★
()
Ответ на: комментарий от theurs

эпизодически

У systemd есть механизм socket activation. Это как inetd, только после первого соединения сервер остаётся работать.

i-rinat ★★★★★
()

Кажется - то что нужно. можно практически напрямую вызывать функции из серверного скрипта

Конечно, вот простой пример использования Pyro4:

Создайте удаленный объект, который будет доступен для вызова из других процессов или машин:

import Pyro4

@Pyro4.expose
class MyObject:
    def say_hello(self, name):
        return "Hello, {}!".format(name)


Создайте Pyro-сервер и зарегистрируйте объект в сервисе именования:

daemon = Pyro4.Daemon()
uri = daemon.register(MyObject)
ns = Pyro4.locateNS()
ns.register("myobject", uri)
print("Ready.")
daemon.requestLoop()


Теперь вы можете вызвать метод удаленного объекта из другого процесса или машины:

import Pyro4

uri = "PYRO:myobject@localhost:50001"
myobject = Pyro4.Proxy(uri)
print(myobject.say_hello("World")) # выведет "Hello, World!"


Это простой пример, но Pyro4 позволяет делать гораздо более сложные вещи, такие как передача объектов между процессами, использование асинхронных вызовов и многое другое.

theurs ★★
()
Последнее исправление: theurs (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.