跳转到主要内容

在多个进程和机器上安排持久任务。

项目描述

这是什么?

zc.async 包提供了一种易于使用的Python工具,可以在多个进程和机器上持久且可靠地安排工作。

例如...

  • Web应用:也许您的Web应用允许用户请求创建大型PDF,或其他昂贵的任务。

  • 延迟工作:也许您有一个需要在特定时间完成的任务,而不是现在。

  • 并行处理:也许您有一个可以分解并使其通过在多个机器上并行执行离散部分来加快速度的长期问题。

  • 序列处理:也许您想要分解和序列化一个工作。

高级功能包括以下内容

  • 易于使用;

  • 灵活配置,生产中可动态更改;

  • 可靠;

  • 支持高可用性;

  • 良好的调试工具;

  • 经过良好测试;

  • 易于测试。

虽然作为Zope项目的一部分进行开发,但zc.async可以独立使用。

它是如何工作的?

系统使用Zope对象数据库(ZODB),一个基于pickle的事务性Python对象数据库,用于参与进程之间的通信和协调。

zc.async的参与者可以各自在自己的进程中运行,或者与其他代码共享一个进程(在线程中运行)。

Twisted框架向该包提供了一些代码(主要是失败和reactor实现)和一些概念。

我在哪里可以了解更多?

快速入门和深入文档可在包中以及新的和有趣的在线文档中找到。

变更

1.5.4 (2011-03-03)

  • 重新排列ftesting.setUp以避免触发ZODB <= 3.9.3中存在的DemoStorage错误。

  • 解决了以下测试问题:某些测试中信号处理程序没有被正确清理,Twisted在ftesting tearDown期间泄漏文件描述符(http://twistedmatrix.com/trac/ticket/3063),以及由于Twisted在停止和随后启动reactor实例时的固执,twisted.txt回归测试不可重复。

  • 修复了可能导致异常的两个未定义变量。

1.5.3 (2009-11-15)

  • 使zc.async.subscribers.ThreadedDispatcherInstaller跟踪它在模块全局“signal_handlers”中安装的信号处理程序。

  • 使zc.async.ftesting.tearDown恢复由ThreadedDispatcherInstaller替换的信号处理程序。

  • 修复了zc.async.ftesting.setUp和zc.async.testing.print_logs中的错误,这会导致日志文件的默认参数在测试中“固定”为不正确的值。

  • 使ftesting.txt测试除了“zc.async.event”外,还锻炼了“zc.async”记录器。

  • zc.async.utils.dt_to_long将返回值强制转换为长整型(在64位Python上测试通过)。

  • 在Python 2.6上测试通过

  • zc.async.job.Job(或其子类之一)的可调用函数可以是Job本身的方法。

1.5.2 (2009-07-22)

  • 修复了zc.async.testing._datetime.now不接受datetime.datetime相同的键参数的问题,并添加了测试。

  • 修复了zc.async.testing._datetime.astimezone不接受datetime.datetime相同的键参数的问题,并添加了测试。

1.5.1 (2008-10-13)

  • providedBy之前使用isinstance添加性能优化。

  • AgentInstaller添加了支持过滤器。

  • 修复了导致monitor.Encoder中条件始终为真的错误。

1.5.0 (2008-09-21)

  • 改进文档。将文档转换为Sphinx系统。

  • RetryCommonForever重试策略的错误提交添加了增量退避。默认情况下,它从0秒开始,每秒递增,最大为60秒。

  • 解决zope.i18nmessageid中的内存泄漏(https://bugs.launchpad.net/zope3/+bug/257657)。此更改应向后兼容。它还会为作业生成略微较小的pickle,但这并不是一个特别的目标。

  • 添加zc.async.partial.Partial以支持向后兼容。

  • 修复了对已安装的Twisted reactor的支持。

  • 修复了并行和顺序作业的重试行为。

  • 将uuid.txt调整为提及zdaemon/supervisor而不是Zope 3。

  • 修复了egg创建中的一些错误。

  • 将配额更改为不使用具有冲突解决的容器,因为这些值应该是严格的极限。

  • 我们只想在我们激活时声明作业。在声明之前,让代理检查父调度器的activateddead属性。

  • 在激活时,也像在停用一样清理调度器代理的作业。这应该可以防止调度器在被停用后获得作业的异常竞争条件。

  • 将调度器更改为在声明作业之前ping。

  • 当ping重新激活调度器时,应使用新的方法 reactivate 而不是 activate。这将触发一个新的 DispatcherReactivated 事件。

  • 从理论上讲,仍然可能(例如,由于一个表现不佳的长提交导致兄弟进程认为进程已死亡)异步工作进程正在处理它不应该处理的作业。例如,作业已被移除,现在是另一个进程的责任。现在,每当进程即将开始任何工作(特别是重试)时,它应确保作业已注册为其自己执行。如果没有,进程应中止事务,记录错误日志,并放弃作业。在作业上写入冲突错误可以保护我们免受此类故事中的边缘情况。

  • 调度器的 getActiveJobs 方法现在实际上告诉你关于当前线程正在发生的事情的信息,而不是数据库中的信息。轮询的 active jobs 键继续报告自上次轮询以来在数据库中为真的信息。此更改还影响了 async jobs 监视命令。

  • 调度器方法 getJobInfo(以及监视命令 async job)现在返回作业的队列名称、作业的代理名称以及作业是否已重新分配或曾经重新分配。

  • zc.async 事件现在从 'zc.component.interfaces.IObjectEvent' 继承,而不是从 zc.async 特定的 IObjectEvent 继承(感谢 Satchit Haridas)。

  • 添加了新的监视和内省工具:新的 asyncdb zc.monitor 命令(以及针对 Python 的 monitordb.py 中的代码)。此代码提供了一种简单的方法来检查 zc.async 中正在发生的事情的数据库视图。因为它是在数据库中,所以它也比 async 工具具有更长的历史视图。了解这些工具的最佳方式是阅读 zc.monitor 中提供的详细文档,使用 asyncdb helpasyncdb help <TOOL NAME>

  • 添加了新的过滤代理选择的优先方式:新的 filter 属性。使用过滤器而不是“选择器”,允许几个 asyncdb 工具根据代理愿意执行的操作来过滤挂起的作业。它也是一个更小的合同,因此与选择器相比,过滤器在常见情况下需要更少的代码。另一方面,仅使用过滤器不允许代理尝试 优先 某些任务。

  • 已弃用 agent.chooseFirst。由于没有选择器且过滤器为 None 的代理的行为与此相同,因此不再需要。它保留用于遗留数据库。

  • 将已弃用的遗留代码移动到新的 legacy 模块。

  • 试图显著减少测试中虚假的计时错误的机会,这导致测试运行时间更长。

  • 监视支持依赖于新的 zc.monitor 软件包,该软件包不是 Zope 特定的。这意味着非 Zope 3 应用程序可以利用监视支持。要使用,请使用 [monitor] 目标;这只会将 simplejson、zc.ngi 和 zc.monitor 添加到基本依赖项中。

  • 除了轮询线程外,ftesting 尝试加入工作线程,以尝试消除 ftests 中的间歇性测试运行器警告,即某个线程被遗留。如果线程没有结束,则通知用户哪些作业不让它结束。(感谢 Patrick Strawderman)

1.4.2 (2009-07-17)

  • 修复了zc.async.testing._datetime.now不接受datetime.datetime相同的键参数的问题,并添加了测试。

1.4.1 (2008-07-30)

  • 新的 serialparallel 辅助函数不允许 postprocess 参数为部分闭包,并且表现得不太好。已修复。

  • 增加了对串行并行高级功能的测试和演示。

  • 对新的快速入门S5文档进行了更多调整。

1.4.0 (2008-07-30)

  • 在ftesting.txt中提到,Zope 3用户应使用zope.app.testing 3.4.2或更高版本。还添加了该文件的开始部分的摘要部分。

  • ftesting.setUp添加了对关键信息的日志记录到__stdout__。这有助于发现回调事务中的问题。这使用了zc.async.testing中的新辅助函数print_logs,该函数主要用于快速且简单的调试。

  • 修改了testing.wait_for_result和testing.wait_for_annotation,使其忽略ReadConflictErrors,以便它们可以在使用MappingStorage的测试以及其他没有MVCC的存储中更可靠地使用。

  • 支持对<type ‘builtin_function_or_method’>进行适配到Job。

  • 在技巧和窍门中添加了关于长提交的警告。

  • 在日志中抱怨了未实际死亡的已停用的轮询调度器后,重新激活。

  • 不再使用中间作业来实现成功/失败添加回调的行为。引入了ICallbackProxy,可用于此类行为。这个变更是由两个愿望驱动的。

    • 不记录中间结果。这会使日志难以阅读,因为重复了不必要的相关信息,隐藏在日志条目中不重要的差异之中。

    • 不必要地记住成功/失败回调中的错误。这可能在异常情况下导致不必要的失败。

    回调代理接受回调,当作业被选中时,这些回调被添加到选定的作业(成功或失败)中。

    此变更引入了一些希望是微不足道的兼容性问题,这基本上归结为回调是代理,而不是真正的作业。使用代理上的便利属性successfailure来查看相应的作业。在代理评估后,job属性将包含实际运行的作业。statusresult是便利属性,用于获取所选作业的状态和结果。

  • parallelserial便利函数添加到zc.async.job,以使分解作业的调度和处理变得非常简单。

  • start便利函数添加到zc.async.configure,以使启动zc.async调度器的常见配置变得非常简单。

  • 不再在resumeCallbacks中使用回调的受保护属性。

  • “局部”代码现在从调度器模块移动到threadlocal。这是为了认识到,如下一项所述,局部代码现在是在调度器模块之外被修改的。

  • 作业在被调用时负责设置“局部”作业值。这意味着zc.async.local.getJob()始终返回当前正在运行的作业,无论是顶级作业(如之前)还是回调(现在)。

  • 开始于S5快速入门演示(请参阅包中的QUICKSTART_1_VIRTUALENV.txt)。

1.3 (2008-07-04)

  • 添加了“技巧和窍门”,并将其纳入PyPI页面。

  • 在Job类中添加了setUptearDown钩子,以便在主作业代码之前和之后运行代码。将setUp的输出作为参数传递给tearDown,以便在需要时将状态传递给另一个。在真正调用作业之前立即运行setUp。在事务提交后或事务失败时,tearDown运行。由重试策略请求的重试会导致方法再次运行。在setUp中的失败被视为作业失败,从重试策略的角度来看(即,作业调用重试策略的jobError方法)。如果setUp失败,则作业不会被调用,但tearDown会被调用。如果tearDown失败,则会记录一个关键日志消息,然后继续处理。

  • 使用新的setUptearDown钩子,添加了一个特定于Zope 3的作业子类(请参阅zc.async.z3.Job),在实例化时记住zope.app.component站点和交互参与者。这些可以更改。然后,当作业运行时,setUp设置站点和与旧参与者的安全交互,然后tearDown在事务提交后将其全部销毁。

  • 将重试策略日志级别从“INFO”更改为“WARNING”。

  • 将许多调度程序错误从“ERROR”级别更改为“CRITICAL”级别。

  • 在RetryCommonForever重试策略上添加了针对“其他”提交重试的“CRITICAL”级别日志。

  • 在队列中添加了remove方法。

  • 添加了设置和销毁Zope 3功能测试(ftesting.py)的辅助函数,并在ftesting.txt中讨论了如何使用zope.app.testing.functional中的层编写Zope 3功能测试。

  • 删除了用于成功/失败回调的过时重试方法(completeStartedJobArguments):现在由重试策略处理。

  • 删除了utils模块中的奇特的完整路径自引用。

  • zc.async.utils.try_transaction_five_times重命名为zc.async.utils.try_five_times

  • 文档改进和修复(感谢Zvezdan Petkovic和Gintautas Miliauskas)。

  • z3的“extra”distutils目标现在明确依赖于zope.security、zope.app.security和zope.app.component。这几乎肯定不会增加z3额外组件的实际依赖性,但它确实反映了包中z3特定模块的新直接依赖。

1.2 (2008-06-20)

  • 将找到已激活代理的日志记录为报告相关队列的oid作为未打包的整数,而不是打包的字符串blob。使用ZODB.utils.p64将其转换回ZODB可以识别的oid。

  • 错误修复:在失败作业时,作业认为它位于其旧代理中,并且fail调用失败。现在通过新doctest catastrophes.txt中的第一个示例进行测试。

  • 作业不再默认在begin_after后一小时设置为begin_by的值。默认现在是无限制。

  • 使调度程序对事务错误和ZEO ClientDisconnected错误更加健壮。

  • 作业现在使用IRetryPolicy来决定在作业失败、提交结果以及在作业中断时应该做什么。这允许支持事务性作业、必须运行到完成的事务性作业以及非事务性作业,例如与外部服务通信。

  • 默认重试策略支持对ClientDisconnected错误、事务错误和中断的重试。

  • 文件 job.txt 已显著扩展,以展示错误处理和重试策略的使用。新文件 catastrophes.txt 展示了处理其他灾难,例如轮询中断的情况。

  • 作业错误现在记录在主 zc.async.event 日志中,而不是 zc.async.trace 日志中。成功继续记录在跟踪日志中。

  • 回调失败默认记录为主日志的 CRITICAL 错误。

  • handleInterrupt 是作业的新协议,用于通知它们在现在已死亡的调度器中处于活跃状态。它们要么失败,要么根据作业相关联的 IRetryPolicy 重新安排。如果它们重新安排,这应该是一个 datetime 或 timedelta。作业调用代理的 reschedule 方法。如果 timedelta 为空或负数,或 datetime 早于现在,则作业将使用队列上的新 putBack 方法放回队列中。这应该是 claim 的相反。使用 putBack 放入队列的作业将在其他作业之前被拉出。

  • 转换为使用 zope.minmax 而不是本地定义的 Atom

  • 修复(并简化)了 last_ping 代码,以减少在原子改变时将父 DispatcherAgents 集合的状态写入数据库的必要性。

  • 依赖于 zc.twist 的新版本(1.3)

  • 将调度器在内存中存储的作业和轮询信息切换为分别按作业或按轮询存储,而不是按时间段存储,以尝试使内存使用更可预测(例如,调度器是否快速处理大量作业,或更慢地执行工作)。

1.1.1 (2008-05-14)

  • 更多 README 调整。

  • 将调度器中包括监控输出的所有报告从使用“未打包”的整数 oids 转换过来。这解决了 simplejson 在尝试将打包的字符串 blob 解释为 unicode,然后使 zc.ngi 崩溃的问题。要获取对象,您需要使用 ZODB.utils.p64,如下所示:connection.get(ZODB.utils.p64(INTEGER_OID)),其中 INTEGER_OID 表示您要检查的对象的整数 oid。

  • 为监控代码添加了更多测试。

  • 使 async jobs 监控命令“即时更新”。在此之前,它包括上一轮询的所有新和活动作业;现在,它还过滤掉了那些已经完成的作业。

  • async job 命令已损坏,如新的监控测试所示。已修复,这意味着我们需要 zope.bforest 的新版本(1.2)以支持那里的新功能。

1.1 (2008-04-24)

  • 当 QueueInstaller 安装 IQueues 和 IQueue 对象时,会触发事件(感谢 Fred Drake)。

  • 调度器使代理线程保持其连接,因此如果代理定期请求具有相同对象的作业,则每个连接的对象缓存使用将得到优化。

  • README 已改进(感谢 Benji York 和 Sebastian Ware)。

  • 回调在跟踪日志中记录开始时。

  • 记录了所有作业结果(包括回调),包括如果回调生成失败则生成的详细跟踪信息。

  • ThreadedDispatcherInstaller 订阅者将线程存储在调度器中,因此您可以通过这种方式关闭测试

    >>> import zc.async.dispatcher
    >>> dispatcher = zc.async.dispatcher.get()
    >>> dispatcher.reactor.callFromThread(dispatcher.reactor.stop)
    >>> dispatcher.thread.join(3)
    
  • getQueue 添加到 zc.async.local 作为便利(它执行您已经可以做的事情: zc.async.local.getJob().queue)。

  • 在接口和 README 中澄清 IQueue.pull 是从队列中删除预定作业的推荐方式。

  • 作业成功或失败的日志报告在开始回调之前。

  • 添加了一个部分,展示了 basic_dispatcher_policy.zcml 的工作方式,然后将以前的 README_3 示例推入 README_3b。

  • 在应该的地方放置了 ZPL。

  • 将多个有用的测试函数从脚注移至zc.async.testing,这样zc.async测试就不需要重新定义,客户端包也可以重用。

1.0 (2008-04-09)

初始版本。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

zc.async-1.5.4.zip (226.6 kB 查看哈希值)

上传时间 源代码

支持

AWSAWS 云计算和安全赞助商 DatadogDatadog 监控 FastlyFastly CDN GoogleGoogle 下载分析 MicrosoftMicrosoft PSF赞助商 PingdomPingdom 监控 SentrySentry 错误日志 StatusPageStatusPage 状态页面