2014-11-21 5 views
1

Я пытаюсь распараллелить скрипт, который печатает, сколько документов, изображений и видео есть в каталоге, а также некоторые другие сведения. Я поместил серийный скрипт в конец этого сообщения. Вот один пример, который показывает, как он выводит информацию о каталоге Дано:темы и функции 'print'

7 documents use 110.4 kb (  1.55 % of total size) 
2 pictures use 6.8 Mb ( 98.07 % of total size) 
0 videos use 0.0 bytes (  0.00 % of total size) 
9 others use 26.8 kb (  0.38 % of total size) 

Теперь я хотел бы использовать потоки, чтобы минимизировать время выполнения. Я пробовал:

import threading 
import tools 
import time 
import os 
import os.path 

directory_path="Users/usersos/Desktop/j" 
cv=threading.Lock() 

type_=["documents","pictures","videos"] 
e={} 
e["documents"]=[".pdf",".html",".rtf",".txt"] 
e["pictures"]=[".png",".jpg",".jpeg"] 
e["videos"]=[".mpg",".avi",".mp4",".mov"] 


class type_thread(threading.Thread): 
    def __init__(self,n,e_): 
     super().__init__() 
     self.extensions=e_ 
     self.name=n 
    def __run__(self): 
     files=tools.g(directory_path,self.extensions) 
     n=len(files) 
     s=tools.size1(files) 
     p=s*100/tools.size2(directory_path) 
     cv.acquire() 
     print("{} {} use {} ({:10.2f} % of total size)".format(n,self.name,tools.compact(s),p)) 
     cv.release() 


types=[type_thread(t,e[t]) for t in type_] 
for t in types: 
    t.start() 
for t in types: 
    t.join() 

Когда я запускаю это, ничего не распечатывается! И когда я вставляю 't' + 'return key' в интерпретаторе, я получаю <type_thread(videos, stopped 4367323136)>. Более того, иногда интерпретатор возвращает правильную статистику с этими же ключами.

Почему?


Первоначальный сценарий (последовательный):

import tools 
import time 
import os 
import os.path 

type_=["documents","pictures","videos"] 
all_=type_+["others"] 
e={} 
e["documents"]=[".pdf",".html",".rtf",".txt"] 
e["pictures"]=[".png",".jpg",".jpeg"] 
e["videos"]=[".mpg",".avi",".mp4",".mov"] 

def statistic(directory_path): 

    #----------------------------- Computing --------------------------------- 

    d={t:tools.g(directory_path,e[t]) for t in type_} 
    d["others"]=[os.path.join(root,f) for root, _, files_names in os.walk(directory_path) for f in files_names if os.path.splitext(f)[1].lower() not in e["documents"]+e["pictures"]+e["videos"]] 
    n={t:len(d[t]) for t in type_} 
    n["others"]=len(d["others"]) 
    s={t:tools.size1(d[t]) for t in type_} 
    s["others"]=tools.size1(d["others"]) 
    s_dir=tools.size2(directory_path) 
    p={t:s[t]*100/s_dir for t in type_} 
    p["others"]=s["others"]*100/s_dir 

    #----------------------------- Printing --------------------------------- 

    for t in all_: 
     print("{} {} use {} ({:10.2f} % of total size)".format(n[t],t,tools.compact(s[t]),p[t])) 
    return s_dir 

ответ

0

Метод запуска(), кажется, не работает. Когда я заменить

for t in types: 
    t.start() 
for t in types: 
    t.join() 

с

for t in types: 
    t.__run__() 

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

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

  • Нет связанных вопросов^_^