首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >python中延迟事件发布订阅

python中延迟事件发布订阅
EN

Stack Overflow用户
提问于 2010-07-13 13:55:37
回答 1查看 584关注 0票数 0

我需要在我的谷歌应用程序引擎应用程序中的事件消息系统。

我指的是下面的python库。

http://pubsub.sourceforge.net/apidocs/concepts.html

我的问题是,我想要执行的侦听器函数是否必须导入(或存在)到执行路径中的某个位置,才能在事件上运行它?

有很多事件,我想让它尽可能地延迟加载。

还能做些什么呢?

python中有没有延迟事件发布订阅框架?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-13 14:45:00

tipfy ( App-Engine特定的微框架)有延迟加载,但仅用于特定的“事件”,即您的代码正在服务的web请求。其他web框架也有它,但是tipfy足够小,足够简单,可以很容易地学习和模仿它的源代码。

因此,如果你因为“延迟加载”的问题而找不到更丰富的事件框架,你可以选择一个需要注册/订阅可调用对象的框架,并允许注册字符串命名函数,就像tipfy所做的那样。当然,这样命名的函数将在需要服务于某个事件时及时加载。

让我用一些简化的、假设的代码来举例说明。假设您有一个事件框架,它包含以下内容:

代码语言:javascript
运行
AI代码解释
复制
import collections
servers = collections.defaultdict(list)

def register(eventname, callable):
    servers[eventname].append(callable)

def raise(eventname, *a, **k):
    for s in servers.get(eventname, ()):
        s(*a, **k)

当然,任何真实事件框架的内部结构都会更加丰富,但在它的最低层可以看到类似这样的东西。

因此,这需要在注册时加载callable ...然而,即使不涉及框架的内部,您也可以轻松地扩展它。考虑一下:

代码语言:javascript
运行
AI代码解释
复制
import sys

class LazyCall(object):
    def __init__(self, name):
        self.name = name
        self.f = None
    def __call__(self, *a, **k):
        if self.f is None:
            modname, funname = self.name.rsplit('.', 1)
            if modname not in sys.modules:
                __import__(modname)
            self.f = getattr(sys.modules[modname], funname)
        self.f(*a, **k)

当然,您需要更好的错误处理&c,但这就是它的要点:将命名函数的字符串(例如'package.module.func')包装到一个知道如何延迟加载它的包装器对象中。现在,register(LazyCall('package.module.func'))将在未接触框架中注册这样的包装器--并根据请求延迟加载它。

顺便说一句,这个用例可以作为Python习惯用法的一个相当好的例子,一些讨厌的笨蛋大声疾呼地断言,这个习惯用法不存在,或者不应该存在,或者是动态地改变自己的类的对象。这个习惯用法的用例是为存在于两种状态之一的对象“充当中间人”,从第一种状态到第二种状态的转换是不可逆的。在这里,懒惰调用者的第一个状态是“我知道函数的名称,但没有对象”,第二个状态是“我知道函数对象”。因为从第一个到第二个是不可逆的,所以如果您愿意,可以减少每次测试的小开销(或Strategy设计模式的间接开销):

代码语言:javascript
运行
AI代码解释
复制
class _JustCallIt(object):
    def __call__(self, *a, **k):
        self.f(*a, **k)

class LazyCall(object):
    def __init__(self, name):
        self.name = name
        self.f = None
    def __call__(self, *a, **k):
        modname, funname = self.name.rsplit('.', 1)
        if modname not in sys.modules:
            __import__(modname)
        self.f = getattr(sys.modules[modname], funname)
        self.__class__ = _JustCallIt
        self.f(*a, **k)

这里的收益是适度的,因为它基本上只从每个调用中减少了一次if self.f is None:检查;但这是一个真正的收益,没有真正的缺点,除了导致以前被命名的任性愚蠢的人陷入他们典型的愤怒和盲目的疯狂(如果你认为这是一个缺点)。

无论如何,实现的选择取决于您,而不是我--或者,幸运的是,他们;-)。

这是一种设计选择:是像tipfy那样直接修补register本身以直接接受字符串参数(并根据需要对它们进行包装),还是在注册站点进行显式包装,让register (或subscribe或其他名称)保持原样。在这种特殊情况下,我并不认为“显式比隐式更好”这句话有多重要,因为像这样

代码语言:javascript
运行
AI代码解释
复制
register(somevent, 'package.module.function')

非常明确,就像

代码语言:javascript
运行
AI代码解释
复制
register(somevent, LazyCall('package.module.function'))

也就是说,it 非常清楚发生了什么,而且可以说它更干净/更具可读性。

不过,显式包装方法保持底层框架不变是非常好的:在任何可以传递函数的地方,现在都可以无缝地传递该函数的名称(作为命名包、模块和函数本身的字符串)。所以,如果我改造现有的框架,我会选择显式的方法。

最后,如果您希望注册不是函数但(例如)某些类的实例或此类实例的绑定方法的可调用对象,则可以为此将LazyCall丰富为LazyInstantiateAndCall &c等变体。当然,体系结构会变得稍微复杂一些(例如,因为您想要实例化新对象的方法和识别已有对象的方法),但是通过将该工作委托给设计良好的工厂系统,应该不会太糟糕。然而,我不会在这样的细化中更深入,因为这个答案已经相当长了,而且无论如何,在许多情况下,简单的“命名函数”方法应该就足够了!-)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3237859

复制
相关文章
可组合的 Vue
2021年5月来自全球各地的Vue.js开发者齐聚线上,一起见证了VueConf 2021 杭州的成功举办。
@超人
2021/07/05
4890
可组合的 Vue
函数c()_函数的调用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/15
3.7K0
匿名函数自调用_自己调用自己的函数叫
我们知道一个HTML文件在被加载的时候是从根标签html依次往下的,在遇到link,script等标签引入的外部资源时,下载外部资源,并执行外部资源。在js中,表达式会被立即执行,也就是说,不管是引入的外部js文件还是嵌入在html文件中的js脚本,其中的表达式都会被立即执行。 函数名是一个指向函数的指针。在JavaScript中,定义函数有常见的两种形式:函数声明和函数直接量(或者叫函数表达式)。 函数声明:采用function定义声明函数的标准写法,包括function,函数名,函数体。如
全栈程序员站长
2022/11/09
2.6K0
奇怪的函数调用
整理移动硬盘时,发现一个名为 attack 的目录,进去以后发现原来是一段简单的 C 语言代码。代码如下:
码农UP2U
2021/09/02
1.8K0
奇怪的函数调用
oracle函数的调用应使用execute命令_matlab函数调用
之前一直使用的MySQL数据库,第一次接触Oracle就用到了函数和存储过程,今天跟大家分享一下使用过程.
全栈程序员站长
2022/10/04
2.3K0
oracle函数的调用应使用execute命令_matlab函数调用
JavaScript 的 this 小结纯粹的函数调用作为对象方法的调用作为构造函数调用apply 调用
函数的不同使用场合,this有不同的值。 总的来说,this就是函数运行时所在的环境对象。 下面分情况,详细讨论
JavaEdge
2018/08/02
2.8K0
JavaScript 的 this 小结纯粹的函数调用作为对象方法的调用作为构造函数调用apply 调用
c++函数调用,函数编写(写自己的函数)以及数组调用,传递
在matlab里.m文件分执行文件和函数文件 在c++中执行文件指:main函数 函数文件:其他所有需要用到的函数
用户7886150
2021/02/03
2.4K0
Lua函数的冒号调用和点调用
冒号定义函数中的self指向函数所属表对象,即self是table类型,通过self表可以:访问挂载在该表下的所有冒号定义函数 如,有定义A={},A:b() A:c();函数b,c都是冒号定义函数,在b,c函数内部self是地址指向A的表,在b函数中可以通过self:c()来调用c函数,同理在c函数中也可以通过self:b()来调用b函数 代码示例:
bering
2020/03/19
3.4K0
python之函数的调用
  实际开发过程中,经常会遇到很多完全相同或者非常相似的操作,这时,可以将实现类似操作的代码封装为函数,然后在需要的地方调用该函数。这样不仅可以实现代码的复用,还可以使代码更有条理性,增加代码的可靠性。下面我们来介绍一下python的调用相关内容。
jiankang666
2022/12/05
1.1K0
python之函数的调用
Python调用PHP的函数
        在电子商务的web平台中有可能存在这样的需求,在月末进行分红账务结算,这样就需要在web服务器下写脚本定时执行数据库的操作,这里有很多种可选的方案,Python调
py3study
2020/01/07
3.5K0
函数的调用约定 _cdecl
_cdecl(C declaration,即C声明)是源起C语言的一种调用约定,它规定,在C语言中,函数实参在线程栈上按照从右至左的顺序依次压栈,也就是说,函数参数从右往左传入。
叶茂林
2023/07/28
3870
函数的调用约定 _cdecl
(十七)函数的调用签名
# 一、函数的调用签名 说明 函数的调用签名跟我们上节课使用 type 来定义函数类型的效果基本类型是一样的 但是它支持函数附带额外属性的情况,因为在 javasctipt 里面函数也是一个特殊的对象,可以包含额外的属性 例 // 和我们之前 使用 type 定义函数类型是一样的,只是调用签名是对象形式 type RequesCallback = { (result: string): void // 以为是对象形式,所以不能使用箭头函数 } function request(callba
老怪兽
2023/02/22
1K0
函数的定义和调用
1.1函数的定义方式 方式1 函数声明方式 function 关键字 (命名函数) function fn(){} 方式2 函数表达式(匿名函数) var fn = function(){} 方式3 new Function( '参数1', '参数2',' 函数体'); var f = new Function('a', 'b', 'console.log(a + b)'); f(1, 2); console.1og(f instanceof Object ); //instanceof
星辰_大海
2020/10/26
1.6K0
函数的定义和调用
【编程经验】函数的调用
主调函数使用被调函数的功能,称为函数调用。在 C 语言中,只有在函数调用时,函数体中定义的功 能才会被执行。
编程范 源代码公司
2018/07/24
8350
函数的定义和调用
1.函数的定义和调用 1.1函数的定义方式 方式1 函数声明方式 function 关键字 (命名函数) function fn(){} 方式2 函数表达式(匿名函数) var fn = function(){ 方式3 new Function() var f = new Function('a', 'b', 'console.log(a + b)'); f(1, 2); ​ var fn = new Function('参数1','参数2'..., '函数体') 1.2函数的调用方式 普通函数
梨涡浅笑
2020/10/27
9120
函数的定义和调用
image.png
清出于兰
2022/05/11
9970
函数的定义和调用
JavaScript 函数调用
在 HTML 中默认的全局对象是 HTML 页面本身,所以函数是属于 HTML 页面。
陈不成i
2021/07/19
2.3K0
关于调用函数
在调用函数时只需要传入指定数量和指定类型的值在参数表的指定位置这些值将在方法启动前赋值给形参
算法与编程之美
2022/10/28
1.5K0
关于调用函数
函数调用约定
现代的几乎所有的编程语言都离不开函数和参数的概念。而这个概念是编程语言级别的,而不是硬件级别的。也就是说硬件上本来没有函数的概念。只是函数的用的太普遍,硬件开始为函数准备专用的指令。
战神伽罗
2019/08/13
2.4K0
函数调用约定
在前面的文章中,可以发现无论是x86架构还是x64架构的程序,其内部的函数在被调用时候, 都是首先将函数参数压入栈中(而且是从右向左),然后调用函数,最后还需要调整栈帧。
Elapse
2020/08/17
2K0

相似问题

可组合函数可以调用不可组合函数吗?

12

从可鼠标调用可组合函数

11

可观测函数中调用可组合函数的问题

13

如何在可组合内部调用内部函数?

17

如何从不可组合函数调用可组合通知对话框

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档