2012-02-22 102 views
3

編輯:此修訂/更新之前此問題的主要部分是如何終止QThread。這已經解決了,問題正在修改爲如何殺死正在進行的請求休息對象。如何殺死正在進行的請求請求對象

http://docs.python-requests.org/en/v0.10.4/user/advanced/#asynchronous-requests 使用異步請求仍顯示出現 - 用戶無法在正在進行的過程中取消該帖子。

基本上,這是需要的功能: 當用戶按下停止上傳,上傳必須立即停止,我可以用停止(),但是它只是檢查停止線程是否應該停止一次循環已經重新結束了。

所以基本上,應該可以使用一個異步請求,讓我檢查它是否應該在請求期間被取消,但是,我不知道如何。

有什麼建議嗎?該帖子的前一部分仍然相關,因此在下面。
請注意,關於如何終止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 

這是IM如何調用它。

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

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

任何人都可以建議在一種方式,我可以快速終止線程 和安靜嗎?或者如果你認爲這不好,一種安全的方法。

但是,如果我不殺即刻它,它會通過在run()方法再次 循環,它會上傳照片,這是 上傳當用戶按下「停止上傳」。我 不希望它這樣做,我寧願把它停止上傳 當前照片的第二個用戶按下「停止上傳」。

感謝。

回答

0

嘗試終止它:

self.workThread.terminate() 

只是要小心,而這樣做。既然你執行的是網絡操作,你不能阻止它,但通常你這樣做:

# Logic... 

if self.running: 
    # Continue logic... 

您設置self.running從線程之外。

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() 

當文件是指清理他們談論倒閉,你可能已經打開,可能是部分入門的資源,毀滅的東西,或者其他任何你可能想要的信號,或只是殺死線程對象之前處理。在上傳器的情況下,您想要在開始每個上傳過程之前檢查線程是否應該退出。這會讓你有機會停止線程,並在線程繼續工作之前退出線程。

+0

哎呀,我不明白,我補充說,雖然和if語句的run()方法,再加上我告訴它打印「觸發」如果發生瞭如果沒有聲明,但事實並非如此。 http://pastebin.com/05pSxCjG 這裏是它的一個引擎收錄,我還在打電話用同樣的方式。 這就是我打電話給stop()的方式。 'def stopUploading(self): self.workThread = WorkThread() self.workThread.stop()' 你可以提出一個原因,它不工作? – Anteara 2012-02-22 07:46:53

+0

這是你從正在啓動workThread的主線程調用的東西嗎?從您的pastebin示例中,您只檢查線程是否應該在循環遍歷文件系統之前退出一次。然後,一旦它完成整個目錄,它將重新開始並檢查它是否應該退出,然後再次遍歷該目錄。這是你想要的功能嗎?如果你想要的只是循環一次,刪除'while',並且每次都用'self._isRunning'檢查''file in file'。如果它仍然讓你困惑,那麼也許我們應該談一談? – jdi 2012-02-22 17:58:25

+0

基本上,我不能讓它工作,我認爲談話會很好。 – Anteara 2012-02-24 09:08:12