2016-10-01 5 views
1

Я пишу сценарий, который должен получить некоторые фотографии из очень большого количества или веб-сайтов. Первый раз, используя многопоточность, подумайте, что это требуется здесь, чтобы получить хорошее время выполнения. Итак, проблема: сценарий запускается, но после кажущегося случайного количества переданных веб-сайтов он больше не продолжается. Это не полностью замораживает то время, которое просто увеличивается от того, что кажется 1/100 сек. до нескольких минут или около того, иногда такой длинный идентификатор просто закрывает его. Также не похоже, что некоторые из сайтов, в частности, ответственны, иногда он получает 970, всего 200 записей. Здесь соответствующие части кода:Python многопоточность замораживания (?) Случайно

concurrent = 200 
q = Queue(concurrent * 2) 

def main(listPath, usagePath, idListPath): 
    [...] 
    for i in range(concurrent): 
     t = Thread(target=work) 
     t.daemon = True 
     t.start() 
    try: 
     for code in usedIDs: 
      q.put(code) 
     q.join() 

    except KeyboardInterrupt: 
     sys.exit(1) 


def work(): 
    while True: 
     code = q.get() 
     picture = getPicture(code) 
     if picture is None: 
      pass # todo: find other source or default 
     if not code in usage.keys(): 
      usage[code] = list() 
     usage[code].append(picture) 
     q.task_done() 

Надеюсь, у меня есть весь важный код. Заранее спасибо!

+0

Для этой задачи я бы предпочел использовать [Pool] (https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.Pool) из [multiprocessing.dummy] (https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.dummy) (который использует потоки), потому что он проще в использовании. – janbrohl

+0

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

+0

Кажется, вы сохранили фотографии в памяти. Если вы используете слишком много памяти в своей программе (больше, чем может хранить ваша оперативная память), ваша ОС может использовать [пейджинг] (https://en.wikipedia.org/wiki/Paging#Performance) на диск, чтобы обеспечить необходимое пространство - что очень медленно. – janbrohl

ответ

0

Мои плохие парни, проблема была на самом деле в функции getPicture. Спасибо за ответы в любом случае!