无法腌制 redis-py 实例 (_thread.lock)

Unable to pickle redis-py instance (_thread.lock)

我正在使用 Redis 的客户端 python 实现(事实上的标准):https://pypi.org/project/redis/

所以我在后台定义了多个worker,每个worker都有一个在启动时创建的连接实例:

class Worker(Process):
    _db = None

    def __init__(self):
        super(Worker, self).__init__()
        self._db = redis.Redis(host="1.2.3.4", port=1234, db=0)

但是,每当我尝试启动这个 worker 的实例时,我都会收到以下错误消息:

TypeError: can't pickle _thread.lock objects

所以我猜测此实现在某处使用了锁。此问题的解决方法是什么?

你不会在带有分叉的 Unix-y OS 上遇到这个问题,但对于 Windows 来说似乎是一个廉价的解决方法,将 redis 实例化延迟到 run在新进程中被调用:

from multiprocessing import Process
import redis

class Worker(Process):
    _db = None
    def __init__(self):
        super().__init__()
        self._db = None
    def run(self):
        self._db = redis.Redis(host='localhost', port=6379, db=0)
        # do stuff

if __name__ == '__main__':
    w = Worker()
    w.start()
    w.join()