【问题标题】:How to kill a requests Request object that is in progress如何杀死正在进行的请求请求对象
【发布时间】:2012-02-22 05:12:57
【问题描述】:

编辑:在此修订/更新之前,此问题的主要部分是如何终止 QThread。已经解决了,问题正在修改为如何杀死正在进行的请求休息对象。

http://docs.python-requests.org/en/v0.10.4/user/advanced/#asynchronous-requests 它似乎使用异步请求仍然阻塞 - 用户无法在帖子进行中取消帖子。

基本上这是所需的功能: 当用户按下 Stop Uploading 时,上传必须立即停止,我可以使用 stop() 停止线程,但是只有在循环再次循环后才检查它是否应该停止。

所以基本上,应该可以使用异步请求,让我检查是否应该在请求期间取消它,但是,我不知道如何。

有什么建议吗?帖子的前一部分仍然相关,所以它在下面。
请注意,如何终止 QThread 的初始问题已经解决,因此下面的代码并不太重要,它只是为了上下文,我现在需要帮助的就是我刚才描述的内容。




我一直在写一个程序,它是一个照片上传器,我做了一个线程 我在其中上传文件。我不知道如何退出 线。我已经尝试过从这里读到的建议:

1) 我尝试了一个 bool 标志,将它包裹在方法和 for 完成工作的语句。

2) 我使用了“with”,然后尝试设置异常。

我希望能够取消上传,最好是快速取消。我读过一个 很多,总是建议“清理”之前的线程 终止它,老实说,我不知道“清理它”是什么意思。 但是,我认为我应该能够杀死线程 - 因为它只是 所做的是将图像的二进制数据发送到 TUMBLR api。它 如果请求被提前取消应该没关系,因为它会 只需取消 api 中的上传即可。

无论如何,这是我的主题:

class WorkThread(QtCore.QThread):
    def __init__(self):
        QtCore.QThread.__init__(self)
        global w
        w = WorkThread
    def __del__(slf):
        self.wait()        
    def run(self):
        url = 'https://www.tumblr.com/api/write'
        files = os.listdir(directory)
        for file in files:
            file_path = os.path.join(directory + '\\' + file)
            file_path = str(file_path)
            if file_path[-3:] in ['bmp', 'gif', 'jpg', 'png', 'thm', 'tif', 'yuv']:
                self.emit(QtCore.SIGNAL('update(QString)'), "Uploading %s ..." % file_path)
                print smart_str(password)
                data = {'email': email, 'password': password, 'type': 'photo'}
                with open(file_path, 'rb') as photo:
                    r = requests.post(url, data=data, files={'data': photo})
                print r.content
        self.emit(QtCore.SIGNAL('update(QString)'), 'All finished! Go check out your stuff on tumblr :)\n')
        return

我是这样称呼它的。

def upload(self):
    self.doneBox.clear()

    self.workThread = WorkThread()
    self.connect( self.workThread, QtCore.SIGNAL("update(QString)"), self.startUploading )
    self.workThread.start()

谁能建议我可以快速终止线程 悄悄地?或者,如果您认为这不好,可以安全地阻止它。

但是,如果我不立即杀死它,它会通过 for 在run() 方法中再次循环,它将上传它的照片 当用户按下“停止上传”时上传。我 不希望它这样做,我宁愿让它停止上传 当前照片用户按下“停止上传”的第二个。

谢谢。

【问题讨论】:

    标签: python multithreading kill qthread python-requests


    【解决方案1】:

    我不确定你在用 global w; w = WorkThread 做什么,但这似乎毫无意义,因为你没有用它做任何事情。

    在你的__init__() 中你想要一个标志:

    def __init__(self):
        ...
        self._isRunning = False
    

    在您的 run() 方法中,您只需检查此标志并在需要时退出:

    def run(self):
        self._isRunning = True
        while True:
            if not self._isRunning:
                # clean up or close anything here
                return
            # do rest of work
    

    也许还可以添加一个简单的便捷方法:

    def stop(self):
        self._isRunning = False
        self.wait()
    

    当文档提到清理时,他们谈论的是关闭您可能已经打开的资源,撤消可能部分启动的事情,或者您可能想要在刚刚之前发出信号或处理的任何其他事情杀死线程对象。对于您的上传者,您想在开始每个上传过程之前检查线程是否应该退出。这将使您有机会停止线程并使其退出,然后再继续进行另一项工作。

    【讨论】:

    • 啊,我不明白,我在 run() 方法中添加了 while 和 if 语句,另外我告诉它如果 if not 语句应该出现,则打印“触发”,但它没有不。 pastebin.com/05pSxCjG 这是它的一个粘贴箱,我仍然用同样的方式称呼它。这就是我调用 stop() 的方式。 def stopUploading(self): self.workThread = WorkThread() self.workThread.stop()你能提出一个不工作的原因吗?
    • 这是您从启动 workThread 的主线程调用的东西吗?从您的 pastebin 示例中,您只检查线程是否应该在循环文件系统之前退出一次。然后,一旦完成整个目录,它将重新开始并检查它是否应该退出,然后再次循环目录。这是你想要的功能吗?如果您只想循环遍历目录一次,请摆脱while 并每次都使用self._isRunning 检查for file in files。如果它仍然让您感到困惑,那么也许我们应该进行对话?
    • 基本上,我无法让它工作,我认为对话会很好。
    • 看来我没有足够的声誉来交谈,而且我住在澳大利亚,所以我们的时区不会真正加起来,我会看看你写的例子。编辑:我现在可以访问对话了。
    【解决方案2】:

    尝试终止它:

    self.workThread.terminate()
    

    这样做时要小心。由于您正在执行网络操作,因此无法停止它,但通常您会这样做:

    # Logic...
    
    if self.running:
      # Continue logic...
    

    您从线程外部设置self.running

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多