class Worker(Process):

    def __init__(self, task_q, host, port, shard_num, cmd, params, kwargs):
        super(Worker, self).__init__()
        self.daemon = True
        self.task_q = task_q
        self.params = dict(params)
        self.kwargs = dict(kwargs)
        if shard_num:
            self.r = ReliableShard(collection='test{}'.format(shard_num), db='test')
            self.r.set_patterns(PATTERNS)
            self.shard = True
        else:
            self.r = Redis(host=host, port=port, db='test')
            self.shard = False
        self.cmd = cmd

    def run(self):
        param = []
        count = 0
        f = self.r.__getattribute__(self.cmd)
        while True:
            # s = time.time()
            task_idx = self.task_q.get(True)
            count += 1
            if self.cmd not in self.params.keys():
                raise ParamsError("There are no params for '{}' command.".format(self.cmd))
            if self.params.get(self.cmd, None):
                param = self.params[self.cmd][task_idx]
            if self.kwargs.get(self.cmd, None):
                kwargs = self.kwargs[self.cmd]
            else:
                kwargs = {}
            f(*param, **kwargs)
            # INFO("One task: {}".format(time.time() - s))
            # INFO("{}::Count: {}".format(self.name, count))
            self.task_q.task_done()