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

未调用.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:50:26