我必须构建一个简单的分布式环形结构的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'
远程对象不能访问超类方法吗?我该如何解决这个问题?
答案 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),也许它们可以为您显示替代解决方案想做。