设置多线程Pyro项目

时间:2019-03-02 18:47:32

标签: python multithreading rmi distributed-system pyro

我必须构建一个简单的分布式环形结构的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'

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

1 个答案:

答案 0 :(得分: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附带了一些示例,这些示例已经实现了聊天框和消息传递系统,因此您可能想看看它们(至少是chatbox和messagebus),也许它们可以为您显示替代解决方案想做。