需要帮助构建并行HTTP请求

时间:2012-02-07 14:50:21

标签: python django concurrency transactions django-commands

这是我的情况。我有三个表BookPublisherPrice。我有一个管理命令,它会对每本书进行循环,对于每本书,它会查询发布者以获取它然后存储到价格表中的价格。这是一个非常简单的HTTP GET或 UDP 请求,我为了得到这个价格。这是我的代码骨架的样子:

@transaction.commit_on_success
def handle(self, *args, **options):
    for book in Book.objects.all():
        for publisher book.publisher_set.objects.all():
            price = check_the_price(publisher.url, book.isbn)
            Price.objects.create(book=book, publisher=publisher, price=price)

代码很简单,但是当我拥有10000本书时,它变得非常慢且耗时。我可以通过并行HTTP请求轻松加快速度。我可以做出50个并行请求,这可以在jiffy中完成,但我不知道如何构造这个代码。

我的网站本身非常小而且重量轻,我正试图远离RabbitMQ / Celery的东西。我觉得现在接受它是一件大事。

有关如何在保持交易完整性的同时执行此操作的任何建议?


编辑#1:这用作我正在做的事情的类比。在编写这个类比时,我忘了提到我还需要发一些UDP请求。

1 个答案:

答案 0 :(得分:3)

您可以使用基于requestsgevent提供准并行请求处理的green threads包。 requests允许您构建许多请求对象,然后以“并行”方式执行。请参阅this example

绿色线程实际上并不是并行运行,而是合作生成执行控制。 gevent可以修补标准库的I / O函数(例如urllib2使用的函数),以便在它们阻塞I / O时产生控制。 request包将其包装到单个函数调用中,该函数调用接受大量请求并返回许多响应对象。它并没有那么容易。