0

我需要使用一个在内部产生线程和子进程的库。

由于在 Web 上下文中不鼓励线程/子进程,因此我需要围绕这个库的某种包装进程。

问题是如何进行。请设计解决方案或图书馆建议?

我知道celery,但是我需要使用这个库执行的几乎所有任务都必须尽快完成,所以我不想将它们放在队列中并稍后执行它们。

一些考虑:

  • 我想从包装器中访问 ORM。
  • 此外,django 用户的身份验证。
  • 真的不需要 django 和分布在不同机器上的包装器,尽管它会是一个加号。
  • 也不需要语言互操作性(一切都是 python)。

编辑:

我在 IRC 中得到的一些建议:

  • 使用分离的进程并进行远程过程调用。仍然不知道我是否会使用 xml、json 或 w/e。
  • 使用带有钩针编织的 Twisted reactor 。对我来说似乎和芹菜几乎一样。

编辑2:

芹菜肯定被丢弃了。我对它进行了长时间的讨论,我得出的结论是,将它用于我的使用原因是荒谬的。我将使用的库基本上是管理远程队列,所以我将成为 NESTING 队列系统。

4

1 回答 1

1

我的建议是你使用钩针,但也许对你最有用的是解释使用钩针和芹菜之间的区别。

  1. Celery 是一个分布式任务队列。这将允许您通过将某些状态持久化到外部队列中来解除对 Web 请求的阻塞(使用 Celery 时需要做的第一件事是选择持久性机制),然后在需要时从消费者那里检索该自动状态执行工作。

  2. Twisted(通过钩针)是一个带有事件驱动 I/O的事件循环。您不需要保留任何外部状态:您只需将工作从 Django(web-request-handling)线程扔到 Twisted(event-loop-work-handling)线程。

使用 Celery,您需要将作业序列化到外部系统,以及配置、监控和运行消息队列服务。因为 Celery 默认使用 Pickle 来序列化它的工作,所以它会神奇地工作,直到你不小心拉入千兆字节的状态,或者你升级你的应用程序并开始获得随机回溯。(不要使用pickle, 不要使用pickle, 不要使用pickle。)您还可以选择JSON 作为您的序列化机制,这不会那么令人惊讶,但会涉及更多手动准备后台处理中涉及的对象.

使用 Twisted,您可以将您的工作扔给同一个进程执行,共享任何有意义的对象(尽管希望小心避免同时从您的 Django 请求和您的 Twisted 线程访问它们)。没有任何额外的监控、管理或配置;一切都发生在你的 Python 进程中。

基本上,Celery 方法工作量更大,但也有额外的优势。通过将所有工作序列化为外部状态,您可以使您的工作人员对崩溃具有弹性,因此当您的 Django 请求完成时,您知道最终会有人处理该工作。您选择的排队系统可能具有管理背压、负载峰值和其他功能的功能,这些功能可能为您的后台工作提供有用的控制平面。

另一方面,使用钩针编织几乎是免费的。除了安装 Twisted 外,它不会施加任何额外的操作限制,没有可能导致系统部分故障的移动部件(您的消息队列系统无法关闭,因为没有这样的系统,您只是在打电话一些功能)。它还可以让您保留可能难以序列化的对象,例如与传出系统的连接,或您不想在排队系统中以纯文本形式存储的凭据。但是,如果您需要任何工具来监控和管理从 Web 前端到任务运行后端的工作,您需要自己实现它。

于 2013-09-29T00:19:00.723 回答