设置多线程Pyro项目

问题描述 投票:0回答:1

我必须构建一个简单的分布式环形结构p2p系统,其中生产者和消费者彼此交互以进行交易。我们需要使用线程或套接字来构建它。我一直在使用Pyro,但我无法弄清楚如何处理生产者或消费者线程。理想情况下,消费者会产生一个线程来向其两个邻居发送请求。邻居可以是消费者或生产者,并将请求转发给他们的邻居。如果找到生产者,则在生成和交易之间建立直接连接之前,请求被支持追溯到原始(消费者)。

需要为每个新消息生成线程或管理线程池。到目前为止我所拥有的是一个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'

远程对象可以访问超类方法吗?我该如何解决这个问题?

python multithreading rmi distributed-system pyro
1个回答
0
投票

你是对的,按照设计,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附带了一些已经实现了聊天框和消息传递系统的示例,因此您可能希望看一下(至少是聊天框和消息总线),也许他们可以向您展示您想要做什么的替代解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.