gpt4 book ai didi

Python 使用虚拟类来应用通用的 "pipe"模式

转载 作者:太空宇宙 更新时间:2023-11-04 11:00:01 25 4
gpt4 key购买 nike

我正在尝试找出是否可以采用以下代码,并使用 python 的魔力来简化代码。

现在我有一个位于一堆 python 子进程之上的命令界面。当我需要与子进程通信时,我将命令通过管道传递给它们。基本上它归结为一个字符串命令和一个参数字典。

这是重复的模式(为了简单起见,我显示了 1,但实际上对于不同的过程重复了 7 次)

创建进程:

class MasterProcess(object):
def __init__(self):
self.stop = multiprocessing.Event()

(self.event_generator_remote, self.event_generator_in)
= multiprocessing.Pipe(duplex=True)
self.event_generator= Process(target=self.create_event_generator,
kwargs={'in': self.event_generator_remote}
)
self.event_generator.start()

def create_event_generator(self, **kwargs):
eg= EventGenerator()
in_pipe = kwargs['in']

while(not self.stop.is_set()):
self.stop.wait(1)
if(in_pipe.poll()):
msg = in_pipe.recv()
cmd = msg[0]
args = msg[1]
if cmd =='create_something':
in_pipe.send(eg.create(args))
else:
raise NotImplementedException(cmd)

然后在命令界面上只是向进程发送命令:

 mp.MasterProcess()
pipe = mp.event_generator_remote

>>cmd: create_something args

#i process the above and then do something like the below

cmd = "create_something"
args = {
#bah
}
pipe.send([command, args])

attempt = 0
while(not pipe.poll()):
time.sleep(1)
attempt +=1
if attempt > 20:
return None
return pipe.recv()

我想转移到更多的是远程外观类型处理,客户端只需像通常那样调用一个方法,然后我将该调用转换为上面的方法。

例如,新命令如下所示:

mp.MasterProcess()
mp_proxy = MasterProcessProxy(mp.event_generator_remote)
mp_proxy.create_something(args)

所以我的虚拟类是 MasterProcessProxy,幕后真的没有方法以某种方式获取方法名称,并提供 args 并将它们通过管道传递给进程?

这有意义吗?是否可以在另一侧做同样的事情?假设管道中的任何内容都将采用 cmd , args 的形式,其中 cmd 是本地方法?然后做一个 self.() ?

当我输入这些内容时,我知道它可能令人困惑,所以请让我知道需要澄清的地方。

谢谢。

最佳答案

您可以使用 __getattr__ 为 stub 类创建代理方法:

class MasterProcessProxy(object):

def __init__(self, pipe):
self.pipe = pipe

# This is called when an attribute is requested on the object.
def __getattr__(self, name):
# Create a dynamic function that sends a command through the pipe
# Keyword arguments are sent as command arguments.
def proxy(**kwargs):
self.pipe.send([name, kwargs])
return proxy

现在你可以随心所欲地使用它了:

mp.MasterProcess()
mp_proxy = MasterProcessProxy(mp.event_generator_remote)
mp_proxy.create_something(spam="eggs", bacon="baked beans")
# Will call pipe.send(["create_something", {"spam":"eggs", "bacon":"baked beans"}])

关于Python 使用虚拟类来应用通用的 "pipe"模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6372832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com