Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 18, 2014 04:44:31

lnkr-a
Зарегистрирован: 2014-04-14
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Null вместо переменной при Exception в многопоточной утилите.

Почему в этом коде при эксепшне в Worker::run() в pic щлазывается Null? Если файл скачивается, то всё ок, т. е. в секции try: всё работает нормально, но ошибку залогировать не могу, ибо в секции except: всегда None…

import sys, threading, time, csv
from datetime import datetime
import urllib
threads_num = int(sys.argv[1])
urls_file = sys.argv[2]
output_path = sys.argv [3]
num = 0
class Worker(threading.Thread):
    def __init__(self, pic_list, output_lock):
        super(Worker, self).__init__()
        self.pic_list = pic_list
        self.output_lock = output_lock
        
    def run(self):
        for pic in self.pic_list[:-1]:            
            try:
                urllib.urlretrieve(pic[2], output_path + pic[0] + ' - ' + pic[1] + '.gif')                             
            except IOError as exp:               
                self.output_lock.acquire()
                log('Error with url: ' + pic[2], self)                
                print 'Error with url: ' + pic[2], self
                self.output_lock.release()
                
log_file = open('log.txt', 'w')
def log(message, obj):
    log_file.write('%s:%03d\t%s\t%s\n' % (datetime.today().strftime('%Y-%m-%d %H:%M:%S'), datetime.today().microsecond / 1000, obj.name, message))
reader = csv.reader(open(urls_file, 'rb'))
ls = []
for row in reader:
    ls.append(row)
chunks = [ls[i::threads_num] for i in range(threads_num)]
output_lock = threading.Lock()
workerlist = []
for chunk in chunks:
    new_worker = Worker(chunk, output_lock)
    workerlist.append(new_worker)
    new_worker.start()

Офлайн

#2 Апрель 21, 2014 06:01:09

fongostev
От: Moskau
Зарегистрирован: 2012-04-03
Сообщения: 62
Репутация: +  4  -
Профиль   Отправить e-mail  

Null вместо переменной при Exception в многопоточной утилите.

А как Вы логируете ошибку exp, не передавая ее в функцию логирования?
P.S.: Кстати, зачем писать в файл в потоках, если можно сохранять ошибку в объекте и потом доставать ее при вызове join, записывая в тот же файл. Так не нужны никакие блокировки, так как доступ к ресурсам раздельный.

Офлайн

#3 Апрель 21, 2014 13:49:05

lnkr-a
Зарегистрирован: 2014-04-14
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Null вместо переменной при Exception в многопоточной утилите.

Наверное, потому что я нуб в Python. Вопрос был в этом разделе потому, что, всё же, посмотрев на “Python для новичков” мультитреадинг не особо обсуждается.

По факту, там во входном файле было много “NULL”, прошу прощения….

PS: Нет, сразу проверить не мог. 4 500 000 строк так просто не пролистать….

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version