未调用.start()却执行多线程?Python多线程并行实现求教
问题分析与解决
你没有正确使用多线程
你遇到的问题根源在于创建Thread对象时的写法错误:
threading.Thread(target=original_to_split(objmain), name=objmain)
这里original_to_split(objmain)是直接调用函数,会立刻在主线程中执行,把函数的返回值传给target参数——而不是把函数本身作为线程要执行的目标。所以哪怕你没调用start(),函数已经被逐个执行了。
实现真正并行的正确写法
要让函数在线程中执行,需要把函数本身传给target,参数通过args(或kwargs)传递,有两种常用方式:
方式1:使用args传递参数
import threading run_01_threading_pool = [] i = 0 # 需先初始化i变量 for objmain in test_scenario: # target传函数名(不要加括号调用),args传参数元组(注意末尾的逗号) thread = threading.Thread(target=original_to_split, args=(objmain,), name=objmain) run_01_threading_pool.append(thread) i += 1 # 启动所有线程 for thread in run_01_threading_pool: thread.start() # 等待所有线程执行完成 for thread in run_01_threading_pool: thread.join() exit(0)
方式2:用lambda包装函数调用
import threading run_01_threading_pool = [] i = 0 for objmain in test_scenario: # 用lambda匿名函数包装,延迟函数调用时机 thread = threading.Thread(target=lambda: original_to_split(objmain), name=objmain) run_01_threading_pool.append(thread) i += 1 # 启动并等待线程 for thread in run_01_threading_pool: thread.start() for thread in run_01_threading_pool: thread.join() exit(0)
补充说明
- 只有调用
thread.start()时,线程才会开始执行目标函数,多个线程启动后会进入并行状态。 - 注意:Python的全局解释器锁(GIL)会限制CPU密集型任务的真正并行,如果你的
original_to_split是CPU密集型操作,建议用multiprocessing模块实现多进程并行;如果是IO密集型(比如文件读写、网络请求),多线程就能有效提升效率。
内容的提问来源于stack exchange,提问作者yoooPai
相关产品推荐
相关产品推荐

