Я пишу сценарий, который должен получить некоторые фотографии из очень большого количества или веб-сайтов. Первый раз, используя многопоточность, подумайте, что это требуется здесь, чтобы получить хорошее время выполнения. Итак, проблема: сценарий запускается, но после кажущегося случайного количества переданных веб-сайтов он больше не продолжается. Это не полностью замораживает то время, которое просто увеличивается от того, что кажется 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()
Надеюсь, у меня есть весь важный код. Заранее спасибо!
Для этой задачи я бы предпочел использовать [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
Возможно, вы столкнулись с утечкой памяти. Вы рассматривали любое профилирование своего скрипта или даже системные ресурсы, когда происходит замедление? – n8sty
Кажется, вы сохранили фотографии в памяти. Если вы используете слишком много памяти в своей программе (больше, чем может хранить ваша оперативная память), ваша ОС может использовать [пейджинг] (https://en.wikipedia.org/wiki/Paging#Performance) на диск, чтобы обеспечить необходимое пространство - что очень медленно. – janbrohl