实例中的异步工作进程
项目描述
摘要
实例中的异步工作进程
如何使用此立方体
将worker立方体添加到您的立方体的依赖项中。在您的模式中,如果需要,扩展立方体的模式。常见的扩展通常涉及向CWWorkerTask实体添加属性和关系,这些实体将包含有关任务的信息(数据,与数据库中其他实体的关系……)。
然后扩展CWWorker实体类。它旨在有 do_xxxx 方法,其中 xxxx 与CWWorkerTask实体的操作属性值相匹配。这些方法使用2个参数调用:一个会话和一个任务。您通常使用任务来获取有关需要做什么的附加参数。该方法应返回一个Unicode字符串,该字符串将用作CWWorkerTask转换信息的消息。
以下是一个示例CWWorker方法,该方法将异步地从数据库中删除一个实体,这对于实体具有许多复合关系并且其删除将触发长时间链式删除的情况很有用。实体位于一个名为 target 的添加的CWWorkerTask关系的末端
def do_delete_entity(self, session, task): entity = task.target[0] session.execute('DELETE Any X WHERE X eid %(eid)s', {'eid': entity.eid}) return _('Success')
要触发删除,您只需创建一个具有正确操作和目标的CWWorkerTask即可(在这种情况下可能需要重写cubicweb.web.views.editforms.DeleteConfFormView并设置自定义控制器)
task = self._cw.create_entity('CWWorkerTask', operation=u'delete_entity', target=some_entity)
实例设置
您需要配置您的实例以启动工作进程。这通过在实例配置文件中将 long-transaction-worker 设置为 True 来完成(这位于 [WORKER] 部分)。这将启动一个定期任务(您也可以使用 worker-polling-period 配置周期),它会查找数据库中的挂起任务。当找到任务时,工作进程将抓取它并开始处理。 worker-max-load 选项设置工作进程可以同时运行的最大任务数。默认值为 2,您可能希望将其设置为 1,但设置更高的值会降低性能。
您可以像往常一样设置您的实例并使用工作进程进行配置,但最有效的方法是设置 2 个(或更多)共享公共数据库的实例。第一个实例将 long-transaction-worker 选项设置为 False,并将重点放在 web 服务上,同时创建新的 CWWorkerTask。其他实例可以是仅存储库(即 cubicweb-ctl create -c repository -a somecube myworkerinstance)并将 long-transaction-worker 设置为 True。这将确保工作进程和 web 服务进程不会为 Python 的全局解释器锁而争斗,从而提供最佳性能。
关于连接池大小的说明:每个由工作进程处理的任务通常可以消耗多达 3 个连接池中的连接。如果您在同一实例中运行工作进程和执行 web 服务的实例,您可能需要将 connections-pool-size 值设置为大于默认值(4):7 或 8 应该是合适的。
项目详情
cubicweb-worker-3.2.0.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | d52b7aaf27a6674e514e33234376d495af30b326438b99745ed1c40b971407a4 |
|
MD5 | 41d252f8967b89671b23cf30b4fffb1e |
|
BLAKE2b-256 | dfaa8cb373f76300a05e253c746ab050f2020ce2fcd96d3c0457eec057a34fbd |