我已经定义了一个Django任务(它使用./manage.py task_name
启动)。此任务从数据库中读取一组对象,并对每个对象执行操作(通常发送ping),将每个结果写回数据库。
目前我有一个简单的for
循环,但它显然太慢,因为它等待每个ping结束以从下一个开始。所以我的问题是,并行操作的最佳方法是什么?
据我所知,我发现的最佳方法是使用Pool
模块中的multiprocessing
,例如the code in this answer。
答案 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请求以及将响应写回数据库。
编写此类蜘蛛的一些指导原则:
一旦你编写了这个蜘蛛,只需从django命令或直接从shell启动它:
scrapy crawl <spider name>