gpt4 book ai didi

python - 使用多处理写入多个文件。错误 : "TypeError: cannot serialize ' _io. TextIOWrapper 对象”

转载 作者:行者123 更新时间:2023-11-30 22:08:15 30 4
gpt4 key购买 nike

我正在尝试将多处理(4 个核心/进程)的结果写入文件。由于CPU核心同时工作,我想到制作4个文件,0.txt1.txt2.txt 3.txt 并将其保存在 multiprocessing.Manager().list() 中。但我收到错误,TypeError: 无法序列化 '_io.TextIOWrapper' 对象

def run_solver(total, proc_id, result, fouts):
for i in range(10)):
fouts[proc_id].write('hi\n')

if __name__ == '__main__':
processes = []
fouts = Manager().list((open('0.txt', 'w'), open('1.txt', 'w'), open('2.txt', 'w'), open('3.txt', 'w')))
for proc_id in range(os.cpu_count()):
processes.append(Process(target=run_solver, args=(int(total/os.cpu_count()), proc_id, result, fouts)))

for process in processes:
process.start()

for process in processes:
process.join()

for i in range(len(fouts)):
fouts[i].close()

我也尝试在函数内使用文件句柄填充列表,如下所示。

def run_solver(total, proc_id, result, fouts):
fout[proc_id] = open(str(proc_id)+'.txt', 'w')
for i in range(10)):
fouts[proc_id].write('hi\n')
fout[proc_id].close()

if __name__ == '__main__':
processes = []
fouts = Manager().list([0]*os.cpu_count())

两者都不起作用,我知道有一些与无法序列化或不可腌制相关的东西。但我不知道如何解决这个问题。有人可以提出解决方案吗?

最佳答案

打开每个进程中的文件。不要在管理器中打开它们,您无法将打开的文件从管理器进程发送到执行器进程。

def run_solver(total, proc_id, result, fouts):
with open(fouts[proc_id], 'w') as openfile:
for i in range(10)):
openfile.write('hi\n')

if __name__ == '__main__':
processes = []
with Manager() as manager:
fouts = manager.list(['0.txt', '1.txt', '2.txt', '3.txt'])
for proc_id in range(os.cpu_count()):
processes.append(Process(
target=run_solver, args=(
int(total/os.cpu_count()), proc_id, result, fouts)
))

如果您在进程之间共享文件名,您希望在写入这些文件时防止竞争条件,那么您确实希望对每个文件使用锁:

def run_solver(total, proc_id, result, fouts, locks):
with open(fouts[proc_id], 'a') as openfile:
for i in range(10)):
with locks[proc_id]:
openfile.write('hi\n')
openfile.flush()


if __name__ == '__main__':
processes = []
with Manager() as manager:
fouts = manager.list(['0.txt', '1.txt', '2.txt', '3.txt'])
locks = manager.list([Lock() for fout in fouts])

for proc_id in range(os.cpu_count()):
processes.append(Process(
target=run_solver, args=(
int(total/os.cpu_count()), proc_id, result, fouts, locks
)
))

因为文件是用 with 打开的,所以它们每次都会自动关闭,并且它们以附加模式打开,因此不同的进程不会相互干扰。您确实需要记住在再次解锁之前刷新写入缓冲区。

顺便说一句,您可能想看看 process pools而不是自己手动进行池化。

关于python - 使用多处理写入多个文件。错误 : "TypeError: cannot serialize ' _io. TextIOWrapper 对象”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52225003/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com