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

Python 从django任务并行化函数的最佳方法,python,django,Python,Django,我已经定义了一个Django任务(它是使用/manage.py task\u name启动的)。此任务从数据库读取一组对象,并对每个对象执行操作(通常发送ping),将每个单独的结果写回数据库 目前我有一个普通的for循环,但它显然太慢了,因为它等待每个ping结束,然后开始下一个ping。所以我的问题是,并行操作的最佳方式是什么 据我所知,我发现最好的方法是使用多处理模块中的池,比如。我认为最好的工具应该是一些事件驱动的网络引擎,比如 与多线程/多处理解决方案不同,事件驱动的网络引擎在高强度i

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

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


据我所知,我发现最好的方法是使用
多处理
模块中的
,比如。

我认为最好的工具应该是一些事件驱动的网络引擎,比如

与多线程/多处理解决方案不同,事件驱动的网络引擎在高强度io操作中大放异彩,没有上下文切换和等待块操作,它们以最有效的方式使用系统资源

使用twisted库的一种方法是编写一个可处理外部网络调用(如您提到的ping请求)以及将响应写回数据库的脚本

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

  • 要从数据库中读取URL的爬行器列表,请参阅
  • 要将响应正确写入数据库,请参阅
  • 编写此spider后,只需从django命令或直接从shell启动它:

    scrapy crawl <spider name>
    
    scrapy爬行
    
    我只是简单地推荐一下


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

    对于您的任务来说,
    多处理可能是最简单的方法,因为它已经是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)