5

在使用 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

但是,额外的处理有时可能需要很长时间,我想知道是否有办法在后台运行它,即异步。

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

4

2 回答 2

6

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

看看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

someobjectZODB 中的持久对象在哪里。至少IAsyncService.queueJob需要一个函数和一个上下文对象,但您可以根据需要添加任意数量的参数来执行任务。参数必须是可腌制的。

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

于 2013-04-08T09:27:04.620 回答
1

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

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

于 2016-02-02T13:00:27.013 回答