这是我的情况。我有三个表Book
,Publisher
和Price
。我有一个管理命令,它会对每本书进行循环,对于每本书,它会查询发布者以获取它然后存储到价格表中的价格。这是一个非常简单的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请求。
答案 0 :(得分:3)
您可以使用基于requests的gevent提供准并行请求处理的green threads包。 requests
允许您构建许多请求对象,然后以“并行”方式执行。请参阅this example。
绿色线程实际上并不是并行运行,而是合作生成执行控制。 gevent
可以修补标准库的I / O函数(例如urllib2使用的函数),以便在它们阻塞I / O时产生控制。 request
包将其包装到单个函数调用中,该函数调用接受大量请求并返回许多响应对象。它并没有那么容易。