0

这是我的情况。我有三张桌子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 个并行请求,这将很快完成,但我不知道如何构造这段代码。

我的网站本身是非常小而轻量级的网站,我试图远离 RabbitMQ/Celery 的东西。我只是觉得现在要做一件大事。

关于如何在保持事务完整性的同时做到这一点的任何建议?


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

4

1 回答 1

3

您可以使用requests包,它提供基于gevent绿色线程的准并行请求处理。requests允许您构建许多请求对象,然后以“并行”方式执行。请参阅此示例

绿色线程实际上并不并行运行,而是协同产生执行控制。gevent可以修补标准库的 I/O 函数(例如 urllib2 使用的函数)以产生控制,否则它们会阻塞 I/O。该request包将其包装到一个函数调用中,该函数调用接受多个请求并返回多个响应对象。没有比这更容易的了。

于 2012-02-07T15:24:57.837 回答