diff --git a/rq/worker.py b/rq/worker.py index 20cd833..7283d56 100644 --- a/rq/worker.py +++ b/rq/worker.py @@ -580,6 +580,16 @@ class Worker(object): """Pops the latest exception handler off of the exc handler stack.""" return self._exc_handlers.pop() + def __eq__(self, other): + """Equality does not take the database/connection into account""" + if not isinstance(other, self.__class__): + raise TypeError('Cannot compare workers to other types (of workers)') + return self.name == other.name + + def __hash__(self): + """The hash does not take the database/connection into account""" + return hash(self.name) + class SimpleWorker(Worker): def _install_signal_handlers(self, *args, **kwargs): diff --git a/tests/test_worker.py b/tests/test_worker.py index c6d85ff..6fa127f 100644 --- a/tests/test_worker.py +++ b/tests/test_worker.py @@ -318,3 +318,12 @@ class TestWorker(RQTestCase): 'Expected at least some work done.') self.assertEquals(job.result, 'Hi there, Adam!') self.assertEquals(job.description, '你好 世界!') + + def test_worker_hash_(self): + """Workers are hashed by their .name attribute""" + q = Queue('foo') + w1 = Worker([q], name="worker1") + w2 = Worker([q], name="worker2") + w3 = Worker([q], name="worker1") + worker_set = set([w1, w2, w3]) + self.assertEquals(len(worker_set), 2)