import pickle def func(data): print(data) def worker(array): array = pickle.loads(array) pool = ThreadPoolExecutor(1) for a in array: pool.submit( func,a ) pool.shutdown(wait=True) if __name__ == '__main__': processes = [] data = [i for i in range(300)] data = pickle.dumps(data) for i in range(3): p = multiprocessing.Process(target=worker, args=(data[100*i:100*(i+1)],)) processes.append(p) p.start() for p in processes: p.join() _pickle.UnpicklingError: pickle data was truncated
时间: 2024-04-20 09:26:54 浏览: 11
这个错误是由于 pickle 数据被截断导致的。在这个代码中,您将数据分成三个部分,并在三个进程中处理它们。在这个过程中,有可能会发生数据被截断的情况,导致无法正确反序列化 pickle 数据。您可以尝试增加数据的大小,或者尝试将其分成更小的块进行处理,以避免这个错误。另外,您还可以将 pickle 数据保存到文件中,然后在不同的进程中读取和处理它们,以避免 pickle 数据被截断的问题。
相关问题
def func(data): print(data) def worker(array): pool = ThreadPoolExecutor(1) for a in array: pool.submit( func,a ) if __name__ == '__main__': processes = [] data = [i for i in range(300)] for i in range(3): p = multiprocessing.Process(target=worker,args=(data[100*i:100*(i+1)],)) processes.append(p) p.start() for p in processes: p.join() Typeerror cannot serializer '_io.BufferedReader' object
这个错误可能是因为`multiprocessing.Process`不支持序列化`_io.BufferedReader`对象。你可以尝试将`data`对象转换为可以序列化的对象,例如使用`pickle`模块进行序列化和反序列化。具体来说,你可以将`data`对象序列化并将其作为参数传递给`worker`函数,然后在`worker`函数中反序列化它。以下是修改后的代码示例:
```
import multiprocessing
import pickle
from concurrent.futures import ThreadPoolExecutor
def func(data):
print(data)
def worker(data):
array = pickle.loads(data)
with ThreadPoolExecutor(1) as pool:
for a in array:
pool.submit(func, a)
if __name__ == '__main__':
processes = []
data = [i for i in range(300)]
serialized_data = pickle.dumps(data)
for i in range(3):
p = multiprocessing.Process(target=worker, args=(serialized_data,))
processes.append(p)
p.start()
for p in processes:
p.join()
```
在这个修改后的代码中,我们首先使用`pickle`模块将`data`对象序列化为一个字节串`serialized_data`,然后将`serialized_data`作为参数传递给`worker`函数。在`worker`函数中,我们使用`pickle`模块的`loads`函数将字节串反序列化为原始的`array`列表。这样,我们就可以避免将`_io.BufferedReader`对象传递给`multiprocessing.Process`,从而避免了这个错误。
loads = pickle.loads AttributeError: module 'pickle' has no attribute 'loads'
根据您提供的引用,报错信息是因为在导入pickle模块时尝试使用了pickle.loads函数,但是pickle模块本身并没有loads这个属性。所以出现了AttributeError: module 'pickle' has no attribute 'loads'的错误。
为了解决这个问题,您需要使用pickle.load而不是pickle.loads函数来加载pkl文件。pickle.load函数用于从文件中加载pickle对象,而pickle.loads函数用于从字符串中加载pickle对象。
以下是正确的代码示例:
```python
import pickle
with open('.\data\MSVD\msvd_vocab.pkl','rb') as f:
v = pickle.load(f)
```
请注意,如果您仍然遇到其他问题,请提供更详细的错误信息以便进一步帮助您解决问题。