Skip to content

Commit daddf94

Browse files
committed
Refator rendervariations command to use concurrent.futures
1 parent ca176f6 commit daddf94

File tree

1 file changed

+20
-58
lines changed

1 file changed

+20
-58
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
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

54
import progressbar
65
from django.apps import apps
@@ -9,23 +8,6 @@
98

109
from 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

3012
class 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

11280
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

Comments
 (0)