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
4
3
5
4
import progressbar
6
5
from django .apps import apps
9
8
10
9
from stdimage .utils import render_variations
11
10
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
-
29
11
30
12
class Command (BaseCommand ):
31
13
help = 'Renders all variations of a StdImageField.'
@@ -73,11 +55,7 @@ def handle(self, *args, **options):
73
55
74
56
@staticmethod
75
57
def render (field , images , count , replace , do_render ):
76
- pool = Pool (
77
- initializer = init_progressbar ,
78
- initargs = [count ]
79
- )
80
- args = [
58
+ kwargs_list = (
81
59
dict (
82
60
file_name = file_name ,
83
61
do_render = do_render ,
@@ -86,39 +64,23 @@ def render(field, images, count, replace, do_render):
86
64
storage = field .storage .deconstruct ()[0 ],
87
65
)
88
66
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
110
78
111
79
112
80
def 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