如何用Python按顺序存储拆分后的二进制数据并优化写入文件
二进制数据拆分多进程写入文件的顺序优化方案
原代码存在两个核心问题导致顺序混乱:
- 进程初始化错误:创建
Process时直接调用了目标函数(比如put_data(data, ...)),这会导致函数在主进程提前执行,子进程并没有真正启动执行任务,完全失去多进程意义。 - 多队列同步问题:使用四个独立队列存储拆分的片段,无法保证每组四个片段被同时读取并按顺序写入,一旦某个队列的元素延迟,就会打乱整体顺序。
优化思路
- 用单个队列替代四个队列,将每组的四个二进制片段打包成一个元组放入队列,保证每组数据的完整性和顺序。
- 修正进程创建方式,正确传递目标函数和参数。
- 添加结束标记,让读取进程知道何时停止,避免无限阻塞。
优化后的代码
import multiprocessing def put_data(data_groups, queue): # 将每组数据打包放入队列 for group in data_groups: queue.put(group) # 放入结束标记 queue.put(None) def get_data(queue): with open("myTest2.jpg", 'wb') as f: while True: group = queue.get() # 遇到结束标记则退出 if group is None: break # 按顺序写入每组的四个片段 for segment in group: f.write(segment) if __name__ == '__main__': # 原始数据 data = [b'\xff\xd8\xff\xe0\x00', b'\x10JFIF', b'\x00\x01\x01\x01\x00', b'H\x00H\x00\x00', b'\xff\xdb\x00C\x00', b'\x06\x04\x05\x06\x05', b'\x04\x06\x06\x05\x06', b'\x07\x07\x06\x08\n', b'\x10\n\n\t\t', b'\n\x14\x0e\x0f\x0c'] data2 = [b'\x10\x17\x14\x18\x18', b'\x17\x14\x16\x16\x1a', b'\x1d%\x1f\x1a\x1b', b'#\x1c\x16\x16 ', b'", #&\'', b')*)\x19\x1f', b'-0-(0', b'%()(\xff', b'\xdb\x00C\x01\x07', b'\x07\x07\n\x08\n'] data3 = [b'\x13\n\n\x13(', b'\x1a\x16\x1a((', b'(((((', b'(((((', b'(((((', b'(((((', b'(((((', b'(((((', b'(((((', b'((((('] data4 = [b'(((((', b'(((\xff\xc2', b'\x00\x11\x08\x04L', b'\x029\x03\x01"', b'\x00\x02\x11\x01\x03', b'\x11\x01\xff\xc4\x00', b'\x1c\x00\x01\x00\x02', b'\x03\x01\x01\x01\x00', b'\x00\x00\x00\x00\x00', b'\x00\x00\x00\x00\x04'] # 把四组数据按索引配对成每组四个片段 data_groups = list(zip(data, data2, data3, data4)) queue = multiprocessing.Queue() # 正确创建进程:target传函数对象,args传参数元组 p1 = multiprocessing.Process(target=put_data, args=(data_groups, queue)) p2 = multiprocessing.Process(target=get_data, args=(queue,)) p1.start() p2.start() p1.join() p2.join()
关键优化点说明
- 单队列存储分组数据:通过
zip将四个列表的对应元素打包成元组,每组数据作为一个整体放入队列,读取时一次性取出一组,从根本上保证顺序不会混乱。 - 修正进程初始化:
Process的target参数传入函数对象(不带括号),args传入参数元组,确保函数在子进程中执行。 - 结束标记机制:写入进程完成后放入
None作为结束信号,读取进程检测到该标记后停止,避免无限阻塞在queue.get()。
内容的提问来源于stack exchange,提问作者HaAbs
相关产品推荐
相关产品推荐

