Python多进程报错'list'不可调用,求批量文件迭代正确方法
问题分析与解决
错误根源
- target参数传错:
multiprocessing.Process(target=go)中,target要求传入可调用的函数对象,但你先执行了go = work(page),得到的是work函数的返回值(从报错看是列表)。进程启动后会尝试调用这个列表,直接触发TypeError: 'list' object is not callable。 - 遍历对象错误:
pages='PDFPAGES'是字符串,循环for page in pages会逐个遍历字符串的字符,这显然不是你需要的批量处理逻辑,应该替换为实际的页数列表或文件路径列表。 - 进程等待逻辑错误:最后
for items in save: start.join()里,start是循环中的临时变量,只会等待最后一个进程结束,正确应该用items.join()。
修正后的多进程代码示例
import multiprocessing def work(page): # 原有业务逻辑 grabthis = Some_class1(page) f = Someclass_2(grabthis, page) output = f.extract() print(output) return output # 替换为实际的页数/文件路径列表 pages = [1, 2, 3, 4] save = [] for page in pages: # 直接传入函数对象work,用args传递参数(必须是元组,单个参数要加逗号) process = multiprocessing.Process(target=work, args=(page,)) process.start() save.append(process) # 等待所有进程执行完毕 for process in save: process.join()
批量文件/任务的多进程/多线程正确写法
多进程(适合CPU密集型任务)
除了手动创建Process,还可以用Pool简化批量处理:
from multiprocessing import Pool if __name__ == '__main__': # 待处理的任务列表 pages = [1, 2, 3, 4] # 创建进程池,processes指定进程数(通常设为CPU核心数) with Pool(processes=4) as pool: # 批量映射执行work函数,results会按顺序收集每个任务的返回值 results = pool.map(work, pages) print(results)
注:Windows系统下,多进程代码必须放在
if __name__ == '__main__':块内,避免重复启动进程;Mac/Linux虽不强制,但加了更规范。
多线程(适合IO密集型任务,如文件读写、网络请求)
用法和Process类似,只是换成threading.Thread:
import threading def work(page): # 原有业务逻辑 grabthis = Some_class1(page) f = Someclass_2(grabthis, page) output = f.extract() print(output) pages = [1, 2, 3, 4] threads = [] for page in pages: thread = threading.Thread(target=work, args=(page,)) thread.start() threads.append(thread) for thread in threads: thread.join()
内容的提问来源于stack exchange,提问作者OTONIEL YONE
相关产品推荐
相关产品推荐

