1- import sys
2- import traceback
3- from multiprocessing import Pool , cpu_count
1+ from concurrent .futures import ProcessPoolExecutor
2+ from multiprocessing import cpu_count
43
54import progressbar
65from django .apps import apps
98
109from stdimage .utils import render_variations
1110
12- try :
13- import resource
14- except ImportError :
15- resource = None
16-
17-
18- BAR = None
19-
20-
21- class MemoryUsageWidget (progressbar .widgets .WidgetBase ):
22- def __call__ (self , progress , data ):
23- if resource is None :
24- return 'RAM: N/A'
25- return 'RAM: {0:10.1f} MB' .format (
26- resource .getrusage (resource .RUSAGE_SELF ).ru_maxrss / 1024
27- )
28-
2911
3012class Command (BaseCommand ):
3113 help = 'Renders all variations of a StdImageField.'
@@ -73,11 +55,7 @@ def handle(self, *args, **options):
7355
7456 @staticmethod
7557 def render (field , images , count , replace , do_render ):
76- pool = Pool (
77- initializer = init_progressbar ,
78- initargs = [count ]
79- )
80- args = [
58+ kwargs_list = (
8159 dict (
8260 file_name = file_name ,
8361 do_render = do_render ,
@@ -86,39 +64,23 @@ def render(field, images, count, replace, do_render):
8664 storage = field .storage .deconstruct ()[0 ],
8765 )
8866 for file_name in images
89- ]
90- pool .map (render_field_variations , args )
91- pool .apply (finish_progressbar )
92- pool .close ()
93- pool .join ()
94-
95-
96- def init_progressbar (count ):
97- global BAR
98- BAR = progressbar .ProgressBar (maxval = count , widgets = (
99- progressbar .RotatingMarker (),
100- ' | ' , MemoryUsageWidget (),
101- ' | CPUs: {}' .format (cpu_count ()),
102- ' | ' , progressbar .AdaptiveETA (),
103- ' | ' , progressbar .Percentage (),
104- ' ' , progressbar .Bar (),
105- ))
106-
107-
108- def finish_progressbar ():
109- BAR .finish ()
67+ )
68+ with progressbar .ProgressBar (maxval = count , widgets = (
69+ progressbar .RotatingMarker (),
70+ ' | CPUs: {}' .format (cpu_count ()),
71+ ' | ' , progressbar .AdaptiveETA (),
72+ ' | ' , progressbar .Percentage (),
73+ ' ' , progressbar .Bar (),
74+ )) as bar :
75+ with ProcessPoolExecutor () as executor :
76+ while next (executor .map (render_field_variations , kwargs_list )):
77+ bar += 1
11078
11179
11280def render_field_variations (kwargs ):
113- try :
114- kwargs ['storage' ] = get_storage_class (kwargs ['storage' ])()
115- do_render = kwargs .pop ('do_render' )
116- if callable (do_render ):
117- do_render = do_render (** kwargs )
118- if do_render :
119- render_variations (** kwargs )
120-
121- global BAR
122- BAR += 1
123- except Exception :
124- raise Exception ("" .join (traceback .format_exception (* sys .exc_info ())))
81+ kwargs ['storage' ] = get_storage_class (kwargs ['storage' ])()
82+ do_render = kwargs .pop ('do_render' )
83+ if callable (do_render ):
84+ do_render = do_render (** kwargs )
85+ if do_render :
86+ render_variations (** kwargs )
0 commit comments