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

Python多进程报错'list'不可调用,求批量文件迭代正确方法

问题分析与解决

错误根源

  1. target参数传错:multiprocessing.Process(target=go) 中,target要求传入可调用的函数对象,但你先执行了go = work(page),得到的是work函数的返回值(从报错看是列表)。进程启动后会尝试调用这个列表,直接触发TypeError: 'list' object is not callable。
  2. 遍历对象错误:pages='PDFPAGES'是字符串,循环for page in pages会逐个遍历字符串的字符,这显然不是你需要的批量处理逻辑,应该替换为实际的页数列表或文件路径列表。
  3. 进程等待逻辑错误:最后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:55:11