Найти - Пользователи
Полная версия: Null вместо переменной при Exception в многопоточной утилите.
Начало » Python для экспертов » Null вместо переменной при Exception в многопоточной утилите.
1
lnkr-a
Почему в этом коде при эксепшне в 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()
fongostev
А как Вы логируете ошибку exp, не передавая ее в функцию логирования?
P.S.: Кстати, зачем писать в файл в потоках, если можно сохранять ошибку в объекте и потом доставать ее при вызове join, записывая в тот же файл. Так не нужны никакие блокировки, так как доступ к ресурсам раздельный.
lnkr-a
Наверное, потому что я нуб в Python. Вопрос был в этом разделе потому, что, всё же, посмотрев на “Python для новичков” мультитреадинг не особо обсуждается.

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

PS: Нет, сразу проверить не мог. 4 500 000 строк так просто не пролистать….
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB