Python多线程调用时已定义worker函数提示未定义如何解决
报错核心原因及解决方法
你遇到的worker is not defined报错最直接的诱因是缩进错误导致的作用域问题,对应具体问题和修复方案如下:
- 函数定义缩进错误
你提供的worker函数定义行前存在多余的前置缩进,这会让worker不属于全局作用域,而是缩进对应的外层代码块(如其他函数、条件分支等)的局部函数。如果调用pool.map的代码所在的作用域无法访问这个局部函数,就会抛出未定义错误。
修复方案:将worker函数的缩进调整到和导入语句、work_items列表定义相同的层级,修正后代码如下:import subprocess # 无多余前置缩进,属于全局作用域 def worker(tup): subprocess.call(tup) - 调用位置与函数定义作用域不匹配
你给出的线程池调用代码前也有额外缩进,说明这段代码是写在某个函数内部的。如果你将worker定义在了其他函数内部,而不是当前调用函数的作用域内,也会触发找不到函数的报错。
修复方案:如果需要把worker定义为局部函数,要确保它和线程池调用代码处于同一个外层函数的作用域内,示例如下:import time from multiprocessing.dummy import Pool as ThreadPool work_items = [] def run_tasks(): # worker定义在调用函数内部,同作用域可正常访问 def worker(tup): subprocess.call(tup) # 执行任务 start = time.time() with ThreadPool(4) as pool: work_results = pool.map(worker, work_items) end = time.time() print(end - start)
额外注意:你的代码中用到了subprocess和time模块,需要在文件头部补充对应的导入语句,避免后续运行出现其他类型的报错。你调用的是外部exe程序,不受Python GIL限制,线程池的数量可以根据你的CPU核心数调整,充分利用硬件性能。
内容的提问来源于stack exchange,提问作者anakaine
相关产品推荐
相关产品推荐

