Let's say I have:
- a list of 3 pairs (login, password) and I intend to create one urllib2 opener for each pair
- one task in Celery
- concurrency = 3
I want to tie each opener to a Task instance (so each task has it's own opener, ie. with different auth cookies).
What I currently do is subclass from Task:
class TaskWithOpener(Task):
abstract = True
_openers = None
@property
def openers(self):
if self._openers is None:
print 'creating openers for', self
(...)
print 'openers already created for ', self, ' just returning them'
return self._openers
and make task like this:
@my_celery.task(rate_limit='5/m', base=TaskWithOpener)
def my_task():
opener = random.choice(my_task.openers)
But this way each task has list of multiple openers and they are created for each thread separately so when there are 3 credential pairs (login, password) and concurrency = 3, my program creates 9 openers which is unacceptable.