[英]Getting TypeError: can't pickle _thread.lock objects
我正在查询MongoDB以获取字典列表,并且对于列表中的每个字典,我正在对值进行一些比较。 基于比较的结果,我将存储字典的值,比较结果以及在mongoDB集合中计算出的其他值。 我正在尝试通过调用多处理来做到这一点,并收到此错误。
def save_for_doc(doc_id):
#function to get the fields of doc
fields = get_fields(doc_id)
no_of_process = 5
doc_col_size = 30000
chunk_size = round(doc_col_size/no_of_process)
chunk_ranges = range(0, no_of_process*chunk_size, chunk_size)
processes = [ multiprocessing.Process(target=save_similar_docs, args=
(doc_id,client,fields,chunks,chunk_size)) for chunks in chunk_ranges]
for prc in processes:
prc.start()
def save_similar_docs(arguments):
#This function process the args and saves the results to MongoDB. Does not
#return anything as the end result is directly stored.
下面是错误:
File "H:/Desktop/Performance Improvement/With_Process_Pool.py", line 144,
in save_for_doc
prc.start()
File "C:\ProgramData\Anaconda3\lib\multiprocessing\process.py", line 105,
in start
self._popen = self._Popen(self)
File "C:\ProgramData\Anaconda3\lib\multiprocessing\context.py", line 223,
in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\ProgramData\Anaconda3\lib\multiprocessing\context.py", line 322,
in _Popen
return Popen(process_obj)
File "C:\ProgramData\Anaconda3\lib\multiprocessing\popen_spawn_win32.py",
line 65, in __init__
reduction.dump(process_obj, to_child)
File "C:\ProgramData\Anaconda3\lib\multiprocessing\reduction.py", line 60,
in dump
ForkingPickler(file, protocol).dump(obj)
TypeError: can't pickle _thread.lock objects
这个错误是什么意思? 请解释一下,我该如何克服。
该文档说,您不能将客户端从主进程复制到子进程,必须在分叉后创建连接。 派生该过程之后,无法复制客户端对象,请创建连接。
在Unix系统上,多处理模块使用fork()生成进程。 将MongoClient实例与fork()配合使用时必须小心。 特别是,绝不能将MongoClient实例从父进程复制到子进程。 相反,父进程和每个子进程必须创建自己的MongoClient实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.