使用twisted和(tx)请求异步下载文件

时间:2018-05-10 08:53:54

标签: python asynchronous python-requests twisted

我正在尝试从扭曲的应用程序中下载来自互联网的文件。由于它直接提供的其他功能或者提供了良好维护的库(重试,代理,缓存控制等),我想使用请求来执行此操作。我对一个没有这些功能的扭曲解决方案持开放态度,但无论如何我似乎无法找到它。

文件应该是相当大的,并且将在慢速连接上下载。因此,我使用请求''; DROP TABLE user;接口和响应的iter_content。在这个问题的最后列出了一个或多或少完整的代码片段。这个入口点是stream=True函数,调用http_downloadurl来写文件,dst和可选callback处理失败的下载。我已经删除了准备目的地(创建文件夹等)所涉及的一些代码以及在反应堆退出期间关闭会话的代码,但我认为它应该仍然可以正常工作。

此代码有效。文件被下载,扭曲的反应堆继续运行。但是,我似乎对这段代码有问题:

errback

因为def _stream_download(r, f): for chunk in r.iter_content(chunk_size=128): f.write(chunk) yield None cooperative_dl = cooperate(_stream_download(response, filehandle)) 仅在有一个块返回时返回,所以反应器处理一个块,运行其他代码,然后返回等待下一个块,而不是让自己忙于更新旋转等待动画GUI(代码实际上没有在这里发布)。

这是问题 -

  • 有没有办法在这台发电机上进行扭曲操作,以便在发电机本身不准备产生某些东西时产生控制?我找到了twisted.flow的一些文档似乎是合适的,但这似乎并没有使它变得扭曲或者今天不再存在。这个问题可以独立于具体细节来阅读,即,对于任何任意的阻塞生成器,或者可以在问题的直接上下文中阅读。
  • 是否有办法使用像请求这样功能齐全的东西来异步下载文件?是否有现成的扭曲模块,我可以使用它?
  • 基本方法是什么将扭曲这样的问题,独立于我想要从请求中使用的http功能。让我们假设我准备抛弃它们或以其他方式实现它们。我如何通过HTTP异步下载文件。
iter_content

1 个答案:

答案 0 :(得分:1)

  

是否有办法在这台发电机上进行扭曲操作,以便在发电机本身不准备产生某些东西时产生控制?

没有。所有Twisted都可以调用代码。如果代码无限期地阻塞,则无限期地阻塞调用线程。这是Python运行时的基本前提。

  

是否有办法使用像请求这样功能齐全的东西来异步下载文件?

treq。你没有说“全功能”在这里意味着什么,但早些时候你提到了“重试”,“代理”和“缓存控制”。我不相信treq目前有这些功能。你可以在treq文档中找到some kind of feature matrix(虽然我注意到它不包括你提到的任何功能 - 即使对于请求也是如此)。我希望这些功能的实现可以作为treq贡献。

  

是否有办法使用像请求这样功能齐全的东西来异步下载文件?

在线程中运行 - 可能使用Twisted的线程池API。

  

基本方法是什么才能解决扭曲这样的问题,独立于我想要从请求中使用的http功能。

TREQ。