Python 需要帮助构造并行HTTP请求

Python 需要帮助构造并行HTTP请求,python,django,concurrency,transactions,django-commands,Python,Django,Concurrency,Transactions,Django Commands,这是我的箱子。我有三张表,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
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个并行请求,这将在一瞬间完成,但我不知道如何构造这段代码

我的网站本身非常小,重量也很轻,我尽量远离RabbitMQ/芹菜之类的东西。我只是觉得这是一件大事

关于如何在保持事务完整性的同时做到这一点,有什么建议吗


编辑#1:这是用来比喻我实际上在做什么。在编写这个类比时,我忘了提到我还需要进行一些UDP请求。

您可以使用基于的提供准并行请求处理的包<代码>请求允许您构建多个请求对象,然后“并行”执行这些请求对象。看

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

您可以使用基于的提供准并行请求处理的包<代码>请求允许您构建多个请求对象,然后“并行”执行这些请求对象。看


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

您真的需要整个操作的事务完整性吗?你不能只更新价格的日期并按图书价格进行交易吗?我想要的是,如果由于某种原因,如果命令在这个长期运行过程中崩溃或遇到一些错误,那么将不会保存任何内容,即全部或无。如果有更好的方法可以解决这个问题,我会很乐意使用它。谢谢。您真的需要整个操作的事务完整性吗?你不能只更新价格的日期并按图书价格进行交易吗?我想要的是,如果由于某种原因,如果命令在这个长期运行过程中崩溃或遇到一些错误,那么将不会保存任何内容,即全部或无。如果有更好的方法可以解决这个问题,我会很乐意使用它。谢谢。我怎么会错过这个图书馆?这听起来很适合我的许多用途。西蒙,如果可以的话,我会给你我所有的选票。谢谢问题是我还需要发出一些UDP请求。这本书,出版商和价格的事情在某种程度上类似于我正在做的工作,我不小心遗漏了UDP部分。看起来我无法使用此模块发出UDP请求。谢谢,很抱歉遗漏了。我在python中没有使用UDP,但是假设您有一些基于
socket
的代码来完成通信部分,您仍然可以使用
gevent
来并行化。是的,我使用的是sockets模块。我从来没有和gevent一起工作过,但我会仔细阅读的。使用线程和队列的解决方案听起来如何?如本例所示:@MridangAgarwalla绿色线程相对于POSIX线程或I/O密集型代码的分叉的优势在于,您可以获得“并行性”,而不需要任何头痛的问题—无需锁定、无需同步、无需在进程之间编组数据。然而,只有一个真正的线程在执行您的代码,当您等待I/O时,它会巧妙地交换调用堆栈。因此,如果您在没有任何I/O的情况下运行计算密集型任务,您将看不到任何性能提升。好吧,Python中不赞成线程,因为全局解释器锁(GIL)这就阻碍了很多真正的并行性。但是,多处理是可以的。我怎么会错过这个库呢?这听起来很适合我的许多用途。西蒙,如果可以的话,我会给你我所有的选票。谢谢问题是我还需要发出一些UDP请求。这本书,出版商和价格的事情在某种程度上类似于我正在做的工作,我不小心遗漏了UDP部分。看起来我无法使用此模块发出UDP请求。谢谢,很抱歉遗漏了。我在python中没有使用UDP,但是假设您有一些基于
socket
的代码来完成通信部分,您仍然可以使用
gevent
来并行化。是的,我使用的是sockets模块。我从来没有和gevent一起工作过,但我会仔细阅读的。使用线程和队列的解决方案听起来如何?如本例所示:@MridangAgarwalla绿色线程相对于POSIX线程或I/O密集型代码的分叉的优势在于,您可以获得“并行性”,而不需要任何头痛的问题—无需锁定、无需同步、无需在进程之间编组数据。然而,只有一个真正的线程在执行您的代码,当您等待I/O时,它会巧妙地交换调用堆栈。因此,如果您在没有任何I/O的情况下运行计算密集型任务,您将看不到任何性能提升。好吧,Python中不赞成线程,因为全局解释器锁(GIL)这就阻碍了很多真正的并行性。多进程