如何终止正在进行的请求 Request 对象

Ant*_*ara 5 python multithreading kill qthread python-requests

编辑:在此修订/更新之前这个问题的主要部分是如何终止 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
Run Code Online (Sandbox Code Playgroud)

我就是这么称呼它的。

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

    self.workThread = WorkThread()
    self.connect( self.workThread, QtCore.SIGNAL("update(QString)"), self.startUploading )
    self.workThread.start()
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议我可以快速安静地终止线程吗?或者,如果您认为这不好,可以采取一种安全阻止它的方法。

但是,如果我不立即杀死它,并且它在方法中再次执行 for 循环run(),它将上传当用户按“”时正在上传的照片Stop Uploading。我不希望它这样做,我希望它在用户按下“ Stop Uploading”时停止上传当前照片。

谢谢。

Ble*_*der 0

尝试终止它:

self.workThread.terminate()
Run Code Online (Sandbox Code Playgroud)

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

# Logic...

if self.running:
  # Continue logic...
Run Code Online (Sandbox Code Playgroud)

self.running您从线程外部设置。