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

时间:2012-02-22 05:12:58

标签: python multithreading kill qthread python-requests

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

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

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

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

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




  

我一直在写一个程序,它是一个照片上传者,我已经创建了一个帖子   我上传文件。我无法弄清楚如何退出   线。我已经尝试了从这里读到的建议:

     

1)我尝试过一个bool标志,将它包裹在方法和方法周围   用于完成工作的陈述。

     

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()方法,它会上传它的照片   当用户按下“停止上传”时上传。一世   我不希望它这样做,我宁愿让它停止上传   用户按下“停止上传”的第二张当前照片。

     

感谢。

2 个答案:

答案 0 :(得分: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()

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

答案 1 :(得分:0)

尝试终止它:

self.workThread.terminate()

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

# Logic...

if self.running:
  # Continue logic...

您可以从主题外部设置self.running