使用一个使用django网站的线程和子进程的库

时间:2013-09-28 12:09:33

标签: django multithreading architecture subprocess twisted

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

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

问题是如何继续这样做。请设计解决方案或图书馆建议?

我知道芹菜,但几乎我需要对这个库做的所有任务必须尽快完成,所以我不想把它们放在一个队列中并获取它们稍后执行。

一些注意事项:

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

编辑:

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

  • 使用单独的进程并执行远程过程调用。仍然不知道我是否会使用xml,json或w / e。
  • 使用带有crochet的扭曲反应器。对我来说似乎和芹菜几乎一样。

编辑2:

芹菜肯定被丢弃了。我有一个很长的谈论它,我得出结论,使用它为我使用的原因将是荒谬的。我将使用的库基本上是管理远程队列,所以我将成为NESTING队列系统。

1 个答案:

答案 0 :(得分:1)

我的推荐将是您使用Crochet,但对您来说最有用的可能是对使用Crochet和Celery之间区别的解释。

  1. Celery是分布式任务队列。这将允许您通过将某些状态保存到外部队列来解除对Web请求的阻塞(当您使用Celery时需要做的第一件事是select a persistence mechanism),然后从消费者那里检索自动状态。时间来执行工作。

  2. Twisted(通过Crochet)是事件循环,带有事件驱动的I / O 。您不需要保留任何外部状态:只需将Django(Web请求处理)线程中的工作丢弃到Twisted(事件循环工作处理)线程。

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

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

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

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