- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将多处理(4 个核心/进程)的结果写入文件。由于CPU核心同时工作,我想到制作4个文件,0.txt
、1.txt
、2.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/
我正在尝试打印以写入文件什么类型的运输和元素 from bs4 import BeautifulSoup from selenium import webdriver stock_file = r"C
运行我的代码时,我不断收到错误消息: TypeError: object of type '_io.TextIOWrapper' has no len() function 我如何让它打开/读取文件并
我使用下面的代码阅读文本格式, f = open("document.txt", "r+", encoding='utf-8-sig') f.read() 但是f的类型是 _io.TextIOWrap
我在尝试编译以下程序时收到错误消息。目标是分析非线性摆和一个特定庞加莱截面的行为。我尝试将摆的行为数据打印到一个文件,并将对应于庞加莱部分的输出打印到另一个文件。 Python shell 中列出的错
我对 Python 还很陌生。我正在尝试学习如何创建模块和导入函数,所以这是在两个文件中的原因是因为我在玩弄它。在我看来,这不是问题所在,但我想我应该在其中添加一些背景故事以防相关。 我知道我的格式和
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我尝试了下面的代码。 f 是 _io.TextIOWrapper 类型,但我找不到有关此类型的任何帮助信息。虽然确实存在另一种类似的类型 io.TextIOWrapper。 >>> f=open("c
代码应该做的主要功能是打开文件并获取中位数。这是我的代码: def medianStrat(lst): count = 0 test = [] for line in lst:
我尝试打开一个dat文件,但遇到UnicodeDecode错误。 请参阅以下我尝试过的代码。 with open(dat_file, 'r') as f: (or) with open(dat_f
我遇到了这个错误。为什么? File "/k.py", line 257, in deskJ eremuak = aFileLine.strip().split('\t') Attribute
为了解决这个错误,我已经做了很多事情,但我已经干涸了。有人知道为什么我总是收到此错误吗? myList =[n, weather, wind, other, avgscore] with op
我收到一个错误 File.open(classname+'.txt','a') AttributeError: '_io.TextIOWrapper' object has no attribute
我正在尝试运行堆栈溢出中提供的示例 here . 我又把代码复制过来了: from sklearn.feature_extraction.text import TfidfVectorizer tex
我想使用以下代码 > 打开一个文件 > 读取内容并去除不需要的行 > 然后将数据写入文件并读取文件以供下游分析。 with open("chr2_head25.gtf", 'r') as f,\
我有一个文本文件,我们称它为 goodlines.txt,我想加载它并创建一个包含文本文件中每一行的列表。 我尝试像这样使用 split() 过程: >>> f = open('goodlines.t
完整代码如下: from Crypto.Protocol.KDF import scrypt from Crypto.Cipher import AES from Crypto.Random impo
我正在尝试使用多处理,其想法是从 Bing 搜索的结果中获取链接,但使用 selenium 更改其中一种配置(cep 配置)。我有一个列表 (filecep) 中的所有 cep,我想将所有结果写入 c
大家。我目前正在努力合并 csv 文件。例如,您有从 filename1 到 filename100 的文件。我使用以下代码合并100个文件,出现以下错误:我先把代码贴出来吧 导入csv fout=o
我收到一个错误 ClassFile.append(文件行) AttributeError: '_io.TextIOWrapper' 对象没有属性 'append' 尝试写入文件时。它是关于写一个关于学
这是我的代码,我试图在我的内存中下载一个 pdf url,然后尝试在第 3 方 python 包 (PYmuPDF) 中打开它。但它显示了这个错误。如何解决? 我的代码 URL = "http
我是一名优秀的程序员,十分优秀!