我有一个驱动程序类,它有一个实例方法写入。我正在尝试使用 Python 多处理将此实例方法应用于队列中的对象。 这是我的代码。
类驱动程序:
def __init__(self, arg1, arg2, arg3):
#initialize
def write(self, key):
# do something
这是我在集合上如何称呼它。
def write_to_db(key, d=Driver(arg1=None, arg2=None, arg3=None)):
d.write(key)
def main():
.........
with multiprocessing.Pool(processes=8) as pool:
driver = Driver(arg1=arg1, arg2=arg2, arg3=arg3)
_ = pool.map(write_to_db, (arr, driver))
我收到以下错误:
TypeError: can't pickle _thread.RLock objects
我怎样才能做到这一点?
简单的答案是你不能,如果你有共享状态,对象将不可选择,python将抛出错误。 长答案是,为此,您必须在池中的进程中实例化对象。
您可以通过这种方式实例化池,
with mp.Pool(processes=processes, initializer=_worker_init, initargs=(config,)) as pool:
results = pool.map(_worker_apply, resources)
如果要传递配置,则config
通过resources
是各个流程将在其上工作的集合。
def _worker_init(config):
# initialize the object here
def _worker_apply(payload):
process = mp.current_process()
return process.simulator.apply(payload)# implement the apply function to manage state of the object
希望这有帮助。