代码之家  ›  专栏  ›  技术社区  ›  Frankline

异步运行Plone订阅者事件

  •  5
  • Frankline  · 技术社区  · 11 年前

    在使用Plone 4时,我成功地创建了一个订阅者事件,以便在保存自定义内容类型时进行额外处理。我通过使用 Products.Archetypes.interfaces.IObjectInitializedEvent 界面

    配置.zcml

    <subscriber 
            for="mycustom.product.interfaces.IRepositoryItem
                 Products.Archetypes.interfaces.IObjectInitializedEvent"
            handler=".subscribers.notifyCreatedRepositoryItem"
       /> 
    

    订阅者.py

    def notifyCreatedRepositoryItem(repositoryitem, event):
        """
        This gets called on IObjectInitializedEvent - which occurs when a new object is created.
        """ 
        my custom processing goes here. Should be asynchronous
    

    然而,额外的处理有时会花费太长时间,我想知道是否有一种方法可以在后台运行,即异步运行。

    是否可以异步运行订阅者事件,例如在保存对象时?

    2 回复  |  直到 11 年前
        1
  •  6
  •   Martijn Pieters    11 年前

    不是开箱即用。您需要将异步支持添加到您的环境中。

    看看 plone.app.async ; 您将需要一个ZEO环境和至少一个额外的实例。后者将运行您从站点推送到队列中的异步作业。

    然后,您可以定义异步执行的方法,并将任务推入队列以异步执行这样的方法。

    示例代码,将任务推入队列:

    from plone.app.async.interfaces import IAsyncService
    
    async = getUtility(IAsyncService)
    async.queueJob(an_async_task, someobject, arg1_value, arg2_value)
    

    以及任务本身:

    def an_async_task(someobject, arg1, arg2):
        # do something with someobject
    

    哪里 someobject 是ZODB中的持久对象。这个 IAsyncService.queueJob 至少 一个函数和一个上下文对象,但您可以添加执行任务所需的更多参数。参数必须是可拾取的。

    然后,如果可以的话,异步工作实例将在当前请求的上下文之外执行该任务。

        2
  •  1
  •   gforcada    8 年前

    只是为了提供更多的选择,你可以尝试 collective.taskqueue 为此,非常简单且功能强大(并避免了plone.app.async的一些缺点)。

    PyPI上的描述已经足够让你很快跟上进度,你可以使用redis进行队列管理,这是一个很大的优势。