gpt4 book ai didi

python - Python DBus 异步方法的实现

转载 作者:太空狗 更新时间:2023-10-30 01:04:03 27 4
gpt4 key购买 nike

如何在 Python DBus 中实现异步方法?以下示例:

class LastfmApi(dbus.service.Object):
def __init__(self):
bus_name = dbus.service.BusName('fm.lastfm.api', bus=dbus.SessionBus())
dbus.service.Object.__init__(self, bus_name, '/')

@dbus.service.method('fm.last.api.account', out_signature="s")
def getUsername(self):
## How do I get this method done asynchronously ??
## For example, this method should go off and retrieve the "username"
## asynchronously. When this method returns, the "username" isn't available
## immediately but will be made available at a later time.

我正在使用 Twisted 的 glib2 react 堆。

更新:我知道这种行为是可以实现的——DBus 包括一个“串行”(唯一标识符)到方法调用,被调用的方法可以访问这个标识符以匹配“调用”带有“回复”。

最佳答案

我还没有尝试过,但是阅读 dbus.service.method 的文档会发现 async_callbacks 参数。听起来好像有人使用此参数来提供异步结果。例如:

@dbus.service.method('fm.last.api.account', out_signature="s",
async_callbacks=("callback", "errback"))
def getUsername(self, callback, errback):
reactor.callLater(3, callback, "alice")

相反,如果您有一个返回 Deferred 的 API,那么您可以轻松地将 Deferred 与这些回调相关联:

d.addCallbacks(callback, errback)

就调用和响应之间的相关性而言,我假设所有序列号处理都隐藏在 dbus.service.method 中。我怀疑当您使用 async_callbacks 功能时传入的回调和错误回调函数是某个可调用的类的实例并且具有序列号作为属性,或者被定义为嵌套函数并关闭序列号。这样,当您调用其中之一时,它们可以确保将正确的值传回连接以将响应与原始请求相关联。

但是,这只是根据您提到的序列号和我在实现各种异步系统方面的经验做出的略有根据的猜测。 :) 阅读 dbus.service.method 的实现可能会毫不费力地揭示实际策略。

(好吧,我现在真的去看了实现,不幸的是它相当复杂,当它到达一些在 C 级 dbus 绑定(bind)中定义的代码时我迷路了,这比挖掘更多我有兴趣做。我仍然怀疑我上面描述的总体思路是正确的,但实现的细节比我预期的要复杂得多。)

关于python - Python DBus 异步方法的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2142115/

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