You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python按顺序存储拆分后的二进制数据并优化写入文件

二进制数据拆分多进程写入文件的顺序优化方案

原代码存在两个核心问题导致顺序混乱:

  1. 进程初始化错误:创建Process时直接调用了目标函数(比如put_data(data, ...)),这会导致函数在主进程提前执行,子进程并没有真正启动执行任务,完全失去多进程意义。
  2. 多队列同步问题:使用四个独立队列存储拆分的片段,无法保证每组四个片段被同时读取并按顺序写入,一旦某个队列的元素延迟,就会打乱整体顺序。

优化思路

  • 用单个队列替代四个队列,将每组的四个二进制片段打包成一个元组放入队列,保证每组数据的完整性和顺序。
  • 修正进程创建方式,正确传递目标函数和参数。
  • 添加结束标记,让读取进程知道何时停止,避免无限阻塞。

优化后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:51:20