【问题标题】:how to run a custom script in parallel with django如何与 django 并行运行自定义脚本
【发布时间】:2015-12-10 19:50:50
【问题描述】:

我想知道是否有任何可能的方法来创建可以使用 django 导入并从 python shell 并行运行的自定义脚本。例如,想象一下我可以在 shell 上写这个:

@make_it_parallel
def my_custom_task():
    from mydjangomodule.models import myclass
    # do something

for user_range in range(0, 1000, 10):
    my_custom_task.delay(user_range)

主要问题是“如何轻松地在脚本上实现并行性”,而不必将某些东西推送到生产环境或为只需要运行一次的脚本设置一整套工具。

P.D.:如果除了 IPython/Celery 之外还有其他工具可以完成这项工作,我会很感兴趣。

【问题讨论】:

  • 不,这是在 django shell 中运行 ./manage.py shell
  • 你需要在你的应用程序中运行它吗?如果不是,你不能只创建一个自定义 Django 命令吗?
  • 请看docs.djangoproject.com/en/1.9/howto/custom-management-commands。至少所有 django 模块/您自己的模型都将在此命令中可用。
  • 这是我想要避免的,必须推动生产。我想在 shell 中运行一个自定义脚本,但能够轻松地并行运行它

标签: python django parallel-processing ipython


【解决方案1】:

我最终使用 ipython ipyparallel 包并行化 django 脚本,这是如何做到的!

首先你需要安装ipyparallelpip install ipyparallel -U

在 ipython 的默认配置文件(或您偏好的任何配置文件)上,我们需要添加这个启动导入来加载 django:

from MyProject import settings
import django
django.setup()

这应该添加到这样的路径中:~/.ipython/profile_default/startup/00-load-django.py

这将在您需要启动的引擎上加载 django,以便 ipython 可以并行化您的函数。

现在,让我们启动能够并行化动态编码的 django 脚本的引擎,确保位于 django 项目的主文件夹中(manage.py 文件所在的位置):ipcluster start -n X where X 将是所需的引擎数量(恕我直言,它将是当前计算机中的核心数量 + 1)

在进入ipython之前请让ipcluster完全运行。

现在,让我们并行化 django 脚本,进入 ipython:

import ipyparallel as ipp
rc = ipp.Client()  # Create the client that will connect to the ipython engines
lview = rc.load_balanced_view()

@lview.parallel()
def show_polls(user_range):
    from poll.models import Poll
    return list(Poll.objects.filter(user_id__gte=user_range, user_id__lt=user_range+100))

for res in show_polls.map(range(0, 1000, 100)):
    print res

我们开始了,一个并行化的 django 脚本!请注意,我将 QuerySet 转换为列表,这是因为返回的任何内容都必须是可选的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多