从django任务并行化函数的最佳方法

时间:2013-12-10 02:19:54

标签: python django

我已经定义了一个Django任务(它使用./manage.py task_name启动)。此任务从数据库中读取一组对象,并对每个对象执行操作(通常发送ping),将每个结果写回数据库。

目前我有一个简单的for循环,但它显然太慢,因为它等待每个ping结束以从下一个开始。所以我的问题是,并行操作的最佳方法是什么?

据我所知,我发现的最佳方法是使用Pool模块中的multiprocessing,例如the code in this answer

3 个答案:

答案 0 :(得分:1)

我只想推荐celery

为要执行并行/异步的操作编写celery任务。让celery处理并发,你自己的代码可以摆脱混乱的进程管理。

答案 1 :(得分:1)

对于你看来非常简单的任务,multiprocessing可能是最简单的方法,只因为它已经是stdlib的一部分了。你可以这样做(未经测试!):

def run_process(record):
    result = ping(record)

pool = Pool(processes=10)
results = pool.map_async(run_process, [records])
for r in results.get():
    write_to_database(r)

答案 2 :(得分:0)

我认为最好的工具是像twisted library

这样的事件驱动型网络引擎

与多线程/多处理解决方案不同,事件驱动的网络引擎在激烈的io操作中闪耀,没有上下文切换和等待块操作,他们以最有效的方式使用系统资源。

使用扭曲库的一种方法是编写scrapy spider,它将处理外部网络调用,例如您提到的ping请求以及将响应写回数据库。

编写此类蜘蛛的一些指导原则:

  1. 从数据库中读取网址的蜘蛛列表,请参阅https://gist.github.com/saidimu/1024207
  2. 将响应正确写入数据库,请参阅Writing items to a MySQL database in Scrapy
  3. 一旦你编写了这个蜘蛛,只需从django命令或直接从shell启动它:

    scrapy crawl <spider name>