Skip to content

Commit 0bd5cca

Browse files
committed
Move subpool_map from Job to context
1 parent 57d15b9 commit 0bd5cca

4 files changed

Lines changed: 45 additions & 31 deletions

File tree

mrq/context.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import re
55
import time
66
from .utils import LazyObject
7+
from itertools import count as itertools_count
78

89

910
# greenletid => Job object
@@ -19,11 +20,16 @@
1920

2021
def set_current_job(job):
2122
current = gevent.getcurrent()
22-
_GREENLET_JOBS_REGISTRY[id(current)] = job
2323

2424
current.__dict__["_trace_time"] = 0
2525
current.__dict__["_trace_switches"] = 0
2626

27+
if job is None:
28+
if id(current) in _GREENLET_JOBS_REGISTRY:
29+
del _GREENLET_JOBS_REGISTRY[id(current)]
30+
else:
31+
_GREENLET_JOBS_REGISTRY[id(current)] = job
32+
2733

2834
def get_current_job(greenlet_id=None):
2935
if greenlet_id is None:
@@ -199,3 +205,33 @@ def metric(name, incr=1, **kwargs):
199205
cfg = get_current_config()
200206
if cfg.get("metric_hook"):
201207
return cfg.get("metric_hook")(name, incr=incr, **kwargs)
208+
209+
210+
def subpool_map(pool_size, func, iterable):
211+
""" Starts a Gevent pool and run a map. Takes care of setting current_job and cleaning up. """
212+
213+
if not pool_size:
214+
return [func(*args) for args in iterable]
215+
216+
counter = itertools_count()
217+
218+
current_job = get_current_job()
219+
220+
def inner_func(*args):
221+
next(counter)
222+
if current_job:
223+
set_current_job(current_job)
224+
ret = func(*args)
225+
if current_job:
226+
set_current_job(None)
227+
return ret
228+
229+
start_time = time.time()
230+
pool = gevent.pool.Pool(size=pool_size)
231+
ret = pool.map(inner_func, iterable)
232+
pool.join(raise_error=True)
233+
total_time = time.time() - start_time
234+
235+
log.debug("SubPool ran %s greenlets in %0.6fs" % (counter, total_time))
236+
237+
return ret

mrq/job.py

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from collections import defaultdict
1414
import traceback
1515
import sys
16-
from itertools import count as itertools_count
1716

1817

1918
class Job(object):
@@ -179,31 +178,6 @@ def insert(self, jobs_data, queue=None, return_jobs=True, w=1):
179178
else:
180179
return inserted
181180

182-
def subpool_map(self, pool_size, func, iterable):
183-
""" Starts a Gevent pool and run a map. Takes care of setting current_job and cleaning up. """
184-
185-
if not pool_size:
186-
return [func(*args) for args in iterable]
187-
188-
counter = itertools_count()
189-
190-
def inner_func(*args):
191-
next(counter)
192-
set_current_job(self)
193-
ret = func(*args)
194-
set_current_job(None)
195-
return ret
196-
197-
start_time = time.time()
198-
pool = gevent.pool.Pool(size=pool_size)
199-
ret = pool.map(inner_func, iterable)
200-
pool.join(raise_error=True)
201-
total_time = time.time() - start_time
202-
203-
log.debug("SubPool ran %s greenlets in %0.6fs" % (counter, total_time))
204-
205-
return ret
206-
207181
def save_status(
208182
self,
209183
status,
@@ -403,6 +377,11 @@ def trace_memory_start(self):
403377
gc.collect()
404378
self._memory_start = self.worker.get_memory()
405379

380+
def subpool_map(self, *args, **kwargs):
381+
""" Deprecated! Use from mrq.context """
382+
from mrq.context import subpool_map
383+
return subpool_map(*args, **kwargs)
384+
406385
def trace_memory_stop(self):
407386
""" Stops measuring memory consumption """
408387

mrq/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
VERSION = "0.1.3"
1+
VERSION = "0.1.4"

tests/tasks/general.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from time import sleep
22
from mrq.task import Task
3-
from mrq.context import log, retry_current_job, connections, get_current_config, get_current_job, progress
3+
from mrq.context import log, retry_current_job, connections, get_current_config, get_current_job, progress, subpool_map
44
from mrq.queue import send_task
55
import urllib2
66
import json
@@ -142,10 +142,9 @@ def inner(self, x):
142142
return x
143143

144144
def run(self, params):
145-
146145
self.job = get_current_job()
147146

148-
return self.job.subpool_map(params["pool_size"], self.inner, params["inner_params"])
147+
return subpool_map(params["pool_size"], self.inner, params["inner_params"])
149148

150149

151150
class GetMetrics(Task):

0 commit comments

Comments
 (0)