我打算multiprocessing
在我的代码中使用以获得更好的性能。
但是,出现以下错误:
Traceback (most recent call last):
File "D:\EpubBuilder\TinyEpub.py", line 49, in <module>
e.epub2txt()
File "D:\EpubBuilder\TinyEpub.py", line 43, in epub2txt
tempread = self.get_text()
File "D:\EpubBuilder\TinyEpub.py", line 29, in get_text
txtlist = pool.map(self.char2text,charlist)
File "C:\Python34\lib\multiprocessing\pool.py", line 260, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
File "C:\Python34\lib\multiprocessing\pool.py", line 599, in get
raise self._value
File "C:\Python34\lib\multiprocessing\pool.py", line 383, in _handle_tasks
put(task)
File "C:\Python34\lib\multiprocessing\connection.py", line 206, in send
self._send_bytes(ForkingPickler.dumps(obj))
File "C:\Python34\lib\multiprocessing\reduction.py", line 50, in dumps
cls(buf, protocol).dump(obj)
TypeError: cannot serialize '_io.BufferedReader' object
我尝试了另一种方式,并收到此错误:
TypeError: cannot serialize '_io.TextIOWrapper' object
我的代码如下所示:
from multiprocessing import Pool
class Book(object):
def __init__(self, arg):
self.namelist = arg
def format_char(self,char):
char = char + "a"
return char
def format_book(self):
self.tempread = ""
charlist = [f.read() for f in self.namelist] #list of char
with Pool() as pool:
txtlist = pool.map(self.format_char,charlist)
self.tempread = "".join(txtlist)
return self.tempread
if __name__ == '__main__':
import os
b = Book([open(f) for f in os.listdir()])
t = b.format_book()
print(t)
我认为由于未Pool
在main函数中使用而引起了错误。
我的猜想对吗?以及如何修改代码以修复错误?
问题是您在实例中有一个无法拾取的实例变量(namelist
)Book
。因为您正在调用pool.map
实例方法,并且您正在Windows上运行,所以整个实例都必须是可腌制的,才能将其传递给子进程。Book.namelist
是一个打开的文件对象(_io.BufferedReader
),无法对其进行腌制。您可以通过两种方法解决此问题。根据html" target="_blank">示例代码,您似乎可以制作format_char
一个顶级函数:
def format_char(char):
char = char + "a"
return char
class Book(object):
def __init__(self, arg):
self.namelist = arg
def format_book(self):
self.tempread = ""
charlist = [f.read() for f in self.namelist] #list of char
with Pool() as pool:
txtlist = pool.map(format_char,charlist)
self.tempread = "".join(txtlist)
return self.tempread
但是,实际上,如果您需要format_char
成为实例方法,则可以在腌制之前从实例中删除参数,从而使用__getstate__
/__setstate__
使其可腌制:Book``namelist
class Book(object):
def __init__(self, arg):
self.namelist = arg
def __getstate__(self):
""" This is called before pickling. """
state = self.__dict__.copy()
del state['namelist']
return state
def __setstate__(self, state):
""" This is called while unpickling. """
self.__dict__.update(state)
def format_char(self,char):
char = char + "a"
def format_book(self):
self.tempread = ""
charlist = [f.read() for f in self.namelist] #list of char
with Pool() as pool:
txtlist = pool.map(self.format_char,charlist)
self.tempread = "".join(txtlist)
return self.tempread
只要您不需要namelist
在子进程中访问,就可以。
问题内容: 假设我有类,并且其中的类具有可读和可写的属性: 是否可以只使用该方法而只使用该方法? 问题答案: 不可以,无法分配每个类别的访问权限。 考虑将您的类分为单独的接口,以便每个类仅获得一个具有所需接口的对象。例如: 当然,这涉及安全性,但这应该使您朝正确的方向进行思考。
问题内容: 我想在Java的String类中添加一个方法,以便我可以键入而不是以获得类似的信息。我也不想添加另一个派生类(例如)。 也许这种方法对您不利,但我个人讨厌使用。但是,无论如何,是否有可能向Java中的String类添加新方法? 感谢致敬。 问题答案: 是最后一个类,这意味着它不能扩展为可以在您自己的实现上工作。
问题内容: 有人可以告诉我,如何在类级别调用方法吗? 假设我有一个如下所示的类,那么我们可以在类级别调用test1Method吗?如果不正确,请告诉我原因。 问题答案: 不,您不能在类下直接拥有方法调用语句或任何其他语句。根据JLS第8节-类的规定: 类的主体声明成员(字段和方法以及嵌套的类和接口),实例和静态初始化器以及构造函数(第8.1.6节)。 您必须在那些成员(某些方法),初始化程序或构造
是否允许使用名称调用对象的方法,如下面的示例所示? Clang和GCC在这里分叉。Clang对程序很好,而GCC打印错误: 演示:https://gcc.godbolt.org/z/pn7jehzdp 根据标准,哪个编译器就在这里?
正如我们所知,没有任何规定可以防止多个线程使用方法调用方法。我确实创建了两个对象和都调用同一个线程来运行。 我需要在第二个对象开始执行之前,通过调用线程来确保第一个对象完成()其执行。 我的问题是为什么我不能在我创建的线程(即)中使用关键字? 我尝试在我创建的线程中使用“同步”来运行()方法,但它给出了任意输出(换句话说,不等待完成执行)。 你可以在程序的最底层看到我得到的输出。 正如您所看到的,
问题内容: 我有一个表,其中通过不存在的CSS类通过jQuery显示/隐藏整列: 有了这个DOM,我可以通过jQuery在一行中完成此操作: 这很好用,但是使用未定义的CSS类是否有效?我应该为此创建一个空类吗? 是否有任何副作用或有更好的方法来做到这一点? 问题答案: “ CSS类”是用词不当;是您分配给HTML元素的属性(或就脚本而言的属性)。换句话说,你在你的情况下,“目标”类HTML,CS