我想知道是否有任何可能的方法来创建一个可以使用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之外还有其他工具可以完成这项工作,我很乐意听到它。
答案 0 :(得分:1)
我最终使用ipython ipyparallel 包并行化django脚本,以下是如何做到的!
首先您需要安装 ipyparallel :pip 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
其中 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转换为列表,这是因为返回的任何内容都需要是可选择的。