gpt4 book ai didi

python - 如何正常中断urllib2下载?

转载 作者:IT老高 更新时间:2023-10-28 20:41:57 39 4
gpt4 key购买 nike

我正在使用urllib2build_opener()创建一个OpenerDirector。我正在使用OpenerDirector来获取慢速页面,因此超时时间很大。

到目前为止,一切都很好。

但是,在另一个线程中,有人告诉我中止下载-假设用户选择退出GUI中的程序。

有没有办法表明应该退出urllib2下载?

最佳答案

没有明确的答案。有几个丑陋的。

最初,我是在回答被拒绝的想法。显然,没有正确的答案,因此我决定将各种次优的替代方法发布为列表答案。其中一些是受评论启发的,谢谢。

图书馆支持

一个理想的解决方案是OpenerDirector提供一个cancel运算符。

它不是。图书馆作者请注意:如果您提供长时间的慢速操作,那么如果人们要在实际应用程序中使用它们,则需要提供一种取消它们的方法。

减少超时

作为其他解决方案,这可能会起作用。超时时间越短,对环境变化的响应就越好。但是,如果在超时时间内未完全完成下载,也会导致下载失败,因此这是一个折衷方案。就我而言,这是站不住脚的。

逐块阅读下载内容。

同样,作为一般解决方案,这可能会起作用。如果下载包含非常大的文件,则可以read them in small chunks,并在读取大块后中止。

不幸的是,如果(如我的情况)延迟是在接收第一个字节而不是文件的大小方面,这将无济于事。

杀死整个线程。

虽然有一些激进的技术可以杀死线程,但是取决于操作系统they are not recommended。特别是,它们可能导致死锁的发生。请参阅Eli Bendersky的two articles(通过@JBernardo)。

只是 react 迟钝

如果中止操作已由用户触发,则最简单的方法就是不响应,直到打开操作完成才对请求进行操作。

这种无响应性是否为用户所接受(提示:否!),取决于您的项目。

即使已知不需要结果,它也会继续对服务器提出要求。

让它逐渐消失在另一个线程中。

如果创建一个单独的线程来运行该操作,然后以可中断的方式与该线程通信,则可以丢弃被阻塞的线程,然后开始进行下一个操作。最终,线程将解除阻塞,然后可以正常关闭。

该线程应该是一个守护程序,因此它不会阻止应用程序的全部关闭。

这将为用户提供响应能力,但这意味着即使不需要结果,也需要继续支持它的服务器。

将套接字方法重写为基于轮询的。

如@Luke的answer中所述,可能可以为标准Python库提供(脆弱?不可移植?)扩展。

他的解决方案将套接字操作从阻塞更改为轮询。另一个可能允许通过socket.shutdown()方法关闭(如果确实会中断被阻塞的套接字-未经测试)。

基于Twisted的解决方案可能更干净。见下文。

用异步的,非基于线程的库替换套接字。

Twisted框架为事件驱动的网络操作提供了一组替代库。我知道这意味着所有不同的通信都可以由一个单线程处理而没有阻塞。

破坏

可以导航OpenerDirector,找到正在阻塞的基本级别套接字,然后直接对其进行破坏(socket.shutdown()足够吗?)以使其返回。

uck

将其放在单独的(可终止的)过程中

读取套接字的线程可以移到一个单独的进程中,并且可以使用进程间通信来传输结果。客户端可以中止此IPC,然后可以终止整个过程。

要求Web服务器取消

如果您可以控制正在读取的Web服务器,则可以向它发送一条单独的消息,要求它关闭套接字。那应该导致被阻止的客户端使用react。

关于python - 如何正常中断urllib2下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11817337/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com