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 中的上传。
无论如何,这是我的主题:
Run Code Online (Sandbox Code Playgroud)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()
任何人都可以建议我可以快速安静地终止线程吗?或者,如果您认为这不好,可以采取一种安全阻止它的方法。
但是,如果我不立即杀死它,并且它在方法中再次执行 for 循环
run()
,它将上传当用户按“”时正在上传的照片Stop Uploading。我不希望它这样做,我希望它在用户按下“ Stop Uploading”时停止上传当前照片。谢谢。
尝试终止它:
self.workThread.terminate()
Run Code Online (Sandbox Code Playgroud)
这样做时要小心。由于您正在执行网络操作,因此您无法停止它,但通常您会这样做:
# Logic...
if self.running:
# Continue logic...
Run Code Online (Sandbox Code Playgroud)
self.running
您从线程外部设置。