首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用‘_thread.lock’启动一个redis进程,但面对的是TypeError: can't pickle redis对象

使用‘_thread.lock’启动一个redis进程,但面对的是TypeError: can't pickle redis对象
EN

Stack Overflow用户
提问于 2020-10-09 10:01:53
回答 1查看 203关注 0票数 1

我必须使用'spawn‘来启动进程,因为我需要在进程之间传输cuda张量。但是使用'spawn‘来创建_thread.lock进程总是面对TypeError: can't pickle redis对象

由于某种原因,此代码删除了某些部分

似乎只有使用'fork‘才能正常工作。

代码语言:javascript
代码运行次数:0
运行
复制
import redis
from torch.multiprocessing import Process

class Buffer(Process):

    def __init__(self, name=0, num_peers=2, actor_queue=0, communicate_queue=0):
        Process.__init__(self)
      
        #some arguments
        self.actor_queue = actor_queue
        self.communicate_queue = communicate_queue
       
        pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
        self.r = redis.Redis(connection_pool=pool)
        self.r.flushall()

    async def write(self, r):
    #do sth

    async def aggregate(self, r):
    #do sth

    def run(self):
        name_process = mp.current_process().name + str(mp.current_process().pid)
        print('starting...', name_process)
        loop = asyncio.get_event_loop()
        asyncio.set_event_loop(loop)
        tasks = asyncio.gather(
            loop.create_task(self.write(self.r)),
            loop.create_task(self.aggregate(self.r)),
        )
        try:
            loop.run_until_complete(tasks)
        finally:
            loop.close()

if __name__ == '__main__':
    mp.set_start_method('spawn')

    queue = mp.Queue(maxsize=5)
    queue.put('sth')
    name = 'yjsp'
    num_peers = 2
    p =Buffer(name, num_peers, queue, c_queue)
    p.start()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-09 11:25:03

问题解决了!

我们应该在run()中定义池和其他东西

原因是:线程存在于进程中,进程启动子进程以实现并行。线程需要锁来避免资源问题,比如多个进程获取相同的资源并导致死锁。

如果我们在run()中定义了pool,那么当我们进入run()方法时,我们已经在子进程中了。

就像这样

代码语言:javascript
代码运行次数:0
运行
复制
    def run(self):
        pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
        r = redis.Redis(connection_pool=pool)
        r.flushall()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64272938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档