多进程环境下Python程序无限重复请求文件名问题求助
问题原因
- 在Windows系统中,
multiprocessing启动子进程时会重新加载整个脚本文件。你写在顶层的name = input("Enter the file name: ")以及后续的全局变量初始化代码,会被每个子进程重复执行,所以每个子进程都会弹出输入请求,看起来像无限循环。
解决方案
把所有顶层执行的代码(除了导入和函数定义)放到if __name__ == '__main__':判断块中。这样只有主进程会执行这些代码,子进程加载脚本时不会运行这部分内容。
修改后的代码:
import multiprocessing from PIL import Image def decode_file(filename): with open(filename, mode='rb') as file: binary_data = file.read() binary_list = [] for byte in binary_data: binary_list.append(format(byte, '08b')) return binary_list def make_row_list(binary_list): row_list = [] l = len(binary_list) for i in range(0, l, 135): row_list.append(binary_list[i:i + 135]) return row_list def fill_row(shared_pixels, width, row_data, count): x_coordinate = 0 for byte in row_data: for bit in byte: index = x_coordinate + count * width shared_pixels[index] = int(bit) x_coordinate += 1 def fill_img(width, height, row_list): shared_pixels = multiprocessing.Array('i', width * height) processes = [] count = 0 for row_data in row_list: p = multiprocessing.Process(target=fill_row, args=(shared_pixels, width, row_data, count)) p.start() processes.append(p) count += 1 for process in processes: process.join() return shared_pixels def create_img(binary_list, no_of_bytes): width, height = 1080, 1920 image = Image.new('1', (width, height)) if no_of_bytes <= 135: x_coordinate = 0 for byte in binary_list: for bit in byte: image.putpixel((x_coordinate, 0), int(bit)) x_coordinate += 1 elif no_of_bytes <= 259200: row_list = make_row_list(binary_list) shared_pixels = fill_img(width, height, row_list) for y in range(height): for x in range(width): image.putpixel((x, y), shared_pixels[x + y * width]) image.save('hi.png') image.show() if __name__ == '__main__': name = input("Enter the file name: ") binary_list = decode_file(name) l = len(binary_list) no_of_bytes = l // 8 create_img(binary_list, no_of_bytes)
额外优化说明
- 把
make_row_list改成接收binary_list参数,避免依赖全局变量,让函数更独立 fill_img也改为接收row_list参数,减少全局变量依赖create_img接收binary_list和no_of_bytes作为参数,让逻辑更清晰,符合模块化编程习惯
内容的提问来源于stack exchange,提问作者ImBlu
相关产品推荐
相关产品推荐

