2017-01-10 2 views
3

У меня есть бесконечный многопоточный загрузчик, который работает так:Python: Multihreading загрузчик блокирующие друг друг

queue = Queue() # links for downloading 

def downloader(queue): 
    while: 
     link = queue.get() 
     # do download with requests library 

for i in range(4): 
    task = Thread(target=downloader, args=(queue,)) 
    task.start() 

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

time 0 - thread 1 - link 1 
time 1 - thread 1 - link 2 
time 2 - thread 1 - link 3 
time 3 - thread 1 - link 4 
time 4 - thread 2 - link 5 
time 5 - thread 2 - link 6 
time 6 - thread 2 - link 7 
time 7 - thread 3 - link 8 
time 8 - thread 3 - link 9 
time 9 - thread 3 - link 10 
time 10 - thread 1 - link 11 
time 11 - thread 1 - link 12 

Я надеялся, что это будет больше похоже на: нить 1 2 3 4 1 2 3 4 сервера имеет 4 cpus.

Благодаря

+0

Можете ли вы показать код запроса? – Eloims

+0

Как вы измеряете свое время? С какой частотой вы вставляете ссылки в 'queue'? Сколько времени занимает «загрузчик»? (Возможно ли, что каждое выполнение 'downloader' завершается _before_, следующая ссылка вставлена ​​в' queue'?) Также обратите внимание, что многопоточность не обязательно использует все CPU. У вас также многопоточность на одном процессоре. –

+0

Вкратце: 'session = запросы.Session()' 'session.cookies = login_cookies.copy()' 'для ссылки в ссылках:' 'data = session.get (url, params = {... }) '' , если data.status_code == 200: '' Fp = открыт (FilePath, 'термометр') '' fp.write (data.content) '' fp.close() ' – Greno

ответ

0

Дважды проверьте свой выходной файл (ы) и где каждый поток записывает. Блокировки записи могут привести к тому, что код будет выполняться более последовательно, чем ожидалось.

+0

Хорошо, я бы также создал отдельную очередь для 'content' и переместил операции с файлом в отдельный поток. –

+0

@a_guest: Неплохая идея, я попробую :) – Greno

+0

@a_guest: спасибо, теперь это работает :) – Greno

Смежные вопросы