我必須使用“spawn”來啟動(dòng)進(jìn)程,因?yàn)槲倚枰谶M(jìn)程之間傳輸 cuda 張量。但是使用“spawn”創(chuàng)建redis進(jìn)程總是面臨TypeError:無法pickle _thread.lock對象由于某種原因,這段代碼刪除了某些部分看來只有使用“fork”才能正常工作import redisfrom torch.multiprocessing import Processclass 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()
1 回答

墨色風(fēng)雨
TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
問題解決了!
我們應(yīng)該在 run() 中定義池和其他東西
原因如下:線程存在于進(jìn)程內(nèi)部,并且進(jìn)程旋轉(zhuǎn)子進(jìn)程以啟用并行。線程需要鎖來防止資源問題,例如多個(gè)進(jìn)程獲取相同的資源并導(dǎo)致死鎖。
如果我們在 run() 中定義池,那么當(dāng)我們進(jìn)入 run() 方法時(shí),我們就已經(jīng)處于子進(jìn)程中。
像這樣
def run(self): pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) r.flushall()
添加回答
舉報(bào)
0/150
提交
取消