Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 23, 2018 13:04:38

Daedalus
Зарегистрирован: 2018-03-11
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки выполнения. Консультация.

Здравствуйте! Прошу помощи с данным вопросом.

Есть код.

 import os, os.path, time
import _thread as thread
list_path = []  #итоговый список всех абсолютных адресов до архивов.
exitmutix = [False] * 2 #нужен будет чтоб подождать завершения дочерних потоков.
def Worms(adress) :
    
    for path_name, list_dir, list_file in os.walk(adress):
        for to_file in list_file:
            full_path = os.path.join(path_name, to_file)
            if full_path.endswith('.rar') or full_path.endswith('.zip') or full_path.endswith('.7z'): #отфильтровывает все, кроме  абсолютных адресов до архивов.
                if full_path in list_path: pass 
                else:
                    if os.stat(full_path).st_size <= 1200000 and int(time.ctime(os.stat(full_path).st_mtime)[-4:]) == 2018: # еще фильтр. отсеивает фаилы больше 1,2 Мб и старше 2018 гг.
                        list_path.append(full_path) # итоговый список всех абсолютных адресов до архивов.
                        
#Вариант_1
Worms(r'\\192.168.0.60\общая 53\clowd\Документы клиентов\Организации')
Worms(r'\\192.168.0.60\общая 53\fcc')
#Вариант_2_потоки
thread.start_new_thread(Worms, (r'\\192.168.0.60\общая 53\clowd\Документы клиентов\Организации', 0))
thread.start_new_thread(Worms, (r'\\192.168.0.60\общая 53\fcc', 1))
print("Start thread")
while False in exitmutix: pass
print('END')

Вопрос вот в чём.
Подскажите пожалуйста почему вариант с потоками работает медленнее ? (или это только у меня медленнее )
Как я думал
Ведь в первом варианте два дерева по очереди обрабатывает , а во втором одновременно, и как я думал должно было быть быстрее пройти все каталоги. А получилось что нет.
Вариант 1 занимает ~ 5 мин, Вариант 2 ~ 9 мин.

Офлайн

#2 Окт. 23, 2018 19:44:06

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Потоки выполнения. Консультация.

Похоже у вас скорость ограничивает не питон а доступ к диску. Который есть просто железка с головкой которая читает данные с поверхности. Раньше читали подряд, а теперь заставляете головку винчестера постоянно прыгать с одного места на другое. На это естественно требуется время.



Офлайн

#3 Окт. 23, 2018 20:06:42

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Потоки выполнения. Консультация.

Это что за прикол?

 exitmutix = [False] * 2 #нужен будет чтоб подождать завершения дочерних потоков.
###
print("Start thread")
while False in exitmutix: pass
print('END')



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Окт. 24, 2018 07:29:18

Daedalus
Зарегистрирован: 2018-03-11
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки выполнения. Консультация.

прошу прощения, забыл указать в примере функции.

 def Worms(adress, index) :
    
    for path_name, list_dir, list_file in os.walk(adress):
        for to_file in list_file:
            full_path = os.path.join(path_name, to_file)
            if full_path.endswith('.rar') or full_path.endswith('.zip') or full_path.endswith('.7z'): #отфильтровывает все, кроме  абсолютных адресов до архивов.
                if full_path in list_path: pass 
                else:
                    if os.stat(full_path).st_size <= 1200000 and int(time.ctime(os.stat(full_path).st_mtime)[-4:]) == 2018: # еще фильтр. отсеивает фаилы больше 1,2 Мб и старше 2018 гг.
                        list_path.append(full_path) # итоговый список всех абсолютных адресов до архивов.
    exitmutix[index] = True

Офлайн

#5 Окт. 24, 2018 23:20:24

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Потоки выполнения. Консультация.

Не это Вам советуют про join прочитать
https://docs.python.org/3/library/threading.html



Офлайн

#6 Окт. 25, 2018 07:08:47

Daedalus
Зарегистрирован: 2018-03-11
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки выполнения. Консультация.

я знаю что такое join в модуле threading. у меня же вопрос был почему два потока работают медленнее одного потока. но похоже пост #2 уже дал ответ.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version