2012-02-22 4 views
3

Редактировать: Основная часть этого вопроса перед этой ревизией/обновлением заключалась в том, как завершить QThread. Это было решено, вопрос пересматривается на «Как убить объект останова запросов», который выполняется.Как убить запросы Объект запроса, который находится в процессе

http://docs.python-requests.org/en/v0.10.4/user/advanced/#asynchronous-requests Похоже, что использование асинхронного запроса все еще блокирует - пользователь не может отменить сообщение во время его выполнения.

В основном это функциональность, которая необходима: Когда пользователь нажимает Stop Uploading, то загрузка должна остановить мгновенно, я могу остановить нить с помощью стоп(), однако это только проверяется, если он должен остановиться, как только цикл снова зациклился.

В принципе, должно быть возможно использовать асинхронный запрос, который позволит мне проверить, следует ли его отменять во время запроса, однако я не знаю, как это сделать.

Любые предложения? Предыдущая часть сообщения по-прежнему актуальна, так что это ниже.
Обратите внимание, что начальный вопрос о том, как завершить QThread, был решен, и поэтому такой код ниже не слишком важен, это просто для контекста, теперь мне нужна помощь, вот что я только что описал.




Я пишу программу, это фото загрузчик, я сделал нить , в котором я загрузить файлы. Я не могу понять, как выйти из потока . Я пробовал предложения, которые я читал отсюда:

1) Я пробовал флаг bool, обертывая его как вокруг метода, так и для оператора, выполняющего эту работу.

2) Я использовал «с», а затем попытался установить исключение.

Я хочу иметь возможность отменить загрузку, желательно быстро. Я читал лот, что всегда рекомендуется «убрать» нить до оканчивая его, я честно не знаю, что 'очистить его' означает. Но, я думаю, я должен был бы просто убить нить - так как все это , то это отправка двоичных данных изображения в 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() 

Можно ли предположить, таким образом, что я могу прекратить поток быстро и спокойно? ИЛИ, если вы считаете, что это нехорошо, способ предотвратить это безопасно.

ОДНАКО, если я не убью его мгновенно, и он проходит через для цикла снова в методе run(), он будет загрузить фотографию, что это была загрузка Когда пользователь нажимает «Stop Выгрузка». I не хотел бы этого делать, я бы предпочел, чтобы он прекратил загружать текущую фотографию , которую пользователь нажимает «Stop Uploading».

Спасибо.

ответ

0

Try его завершением:

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

Argh, я не понимаю, я добавил, что while и if выражение для метода run(), плюс я сказал ему распечатать 'triggered', если инструкция if not должна произойти, но это не так. http://pastebin.com/05pSxCjG вот пастебин, и я все равно называю его таким же образом. Вот как я вызываю stop(). 'def stopUploading (self): self.workThread = WorkThread() self.workThread.stop()' Можете ли вы предложить причину, по которой он не работает? – Anteara

+0

Это что-то, что вы вызываете из основного потока, который запускает workThread? Из примера вашего pastebin вы только проверяете, должен ли поток выходить один раз, прежде чем он перейдет через файловую систему. Затем, как только он будет выполнен с полным каталогом, он начнет работу и проверяет, должен ли он выйти, а затем снова зациклиться на каталоге. Это функциональность, которую вы хотите? Если все, что вам нужно, - это циклическое перемещение по директории, избавляйтесь от 'while' и просто делайте' для файла в файлах' с помощью проверки 'self._isRunning' каждый раз. Если это все еще запутывает вас, тогда, может быть, мы должны поговорить? – jdi

+0

В принципе, я не могу заставить его работать, я думаю, что разговор будет хорошим. – Anteara