Настройка многопоточного Pyro-проекта - PullRequest
0 голосов
/ 02 марта 2019

Мне нужно создать простую распределенную p2p-систему с кольцевой структурой, в которой производитель и потребитель взаимодействуют друг с другом для заключения сделки.Мы обязаны построить его, используя потоки или сокеты.Я использую Pyro, но я не могу понять, как обрабатывать потоки производителя или потребителя.В идеале потребитель должен создать поток для отправки запроса обоим соседям.Соседи могут быть потребителями или производителями и передавать запрос своим соседям.Если производитель найден, запрос ПРЕДПОЛАГАЕТСЯ отследить до источника (потребителя) до того, как будет установлено прямое соединение между prod и cons и когда транзакция состоится.

Требуется порождать потоки для каждого из них.новое сообщение или управление пулом потоков.Пока что у меня есть класс Pyro, который выглядит следующим образом:

import threading

import Pyro4

class Peer(object):

     def __init__():
         #sets up quantity, lock, id, neighbourlist
         #neighbour list has max 2 entries

     def lookup():
         # creates a msg object to be sent to forward()

     def forward():
         #sends msg to neighbors by creating proxies and calling 
         #the receive method on them

     def receive():
         #called when a msg is received. acquires lock and accesses the 
         #quantity. releases lock if not a producer or quantity is low    

class Message(object):
      def __init__(params):
          #sets up a message object with the given params like  
          #msgid, consumerid, quan, producerid, forwarder_id(so that the message is not sent backwards)

Я пытался сделать класс Peer подклассом Threading.Thread, но когда я использовал прокси Pyro для вызова метода start ()потоки выдавали мне ошибку:

AttributeError: удаленный объект 'PYRO: obj_32f7c4e3f79146ac94a3389303e45361 @ localhost: 35275' не имеет открытого атрибута или метода 'start'

Могут ли удаленные объекты не обращаться к методам суперкласса?Как мне исправить это?

1 Ответ

0 голосов
/ 05 марта 2019

Вы правы, по замыслу, Pyro позволяет вам только вызывать удаленные методы, которые вы явно выставили.Это означает, что методы из суперкласса НЕ доступны.

Существует несколько способов получить к ним удаленный доступ в любом случае (см. https://pyro4.readthedocs.io/en/stable/servercode.html#exposing-classes-and-methods-without-changing-existing-source-code), но это не решение в данном случае. Вы, вероятно, не хотитеуправлять тем, как ваш сервер взаимодействует с параллелизмом (в данном случае потоками), удаленно.

Почему бы вам не использовать тот факт, что тип сервера по умолчанию, который использует Pyro4, уже является многопоточным сервером?И вы можете контролировать некоторые аспекты того, как Pyro заботится о ваших объектах (например, чтобы он создавал новый экземпляр для каждого вызова, если вы этого хотите) https://pyro4.readthedocs.io/en/stable/servercode.html#controlling-instance-modes-and-instance-creation

Наконец, Pyro4 поставляется с несколькимипримеры, в которых уже есть окно чата и система обмена сообщениями, так что вы можете захотеть взглянуть на них (по крайней мере, chatbox и messagebus), возможно, они могут показать вам альтернативное решение того, что вы хотите сделать.

...